Можем ли мы перезаписать «enabled» в @BeforeTest в TestNg через аргумент Vm? - PullRequest
0 голосов
/ 21 января 2020

Можем ли мы отключить @BeforeTest через аргумент vm со значением по умолчанию enabled=true?

@BeforeTest(enabled = true)
public void someMethod(){
...}

Я не хочу запускать someMethod. Я не хочу добавлять какие-либо параметры и проверять условия также.

1 Ответ

0 голосов
/ 22 января 2020

Вы можете очень хорошо сделать это, используя реализацию org.testng.IAnnotationTransformer.

Ниже приведен пример, который показывает, как выглядит трансформатор [Убедитесь, что вы используете последнюю выпущенную версию TestNG, а именно, 7.1.0 на сегодняшний день]

Следует помнить:

  • Убедитесь, что вы подключаете преобразователь аннотаций только через файл комплекта.
  • Чтобы выборочно отключить любой метод конфигурации ( не просто @BeforeTest), вы просто передаете полное имя метода в виде значений, разделенных запятыми, в качестве аргумента JVM [например, -Dmethods.disable=com.rationaleemotions.stackoverflow.qn59840389.SampleTestClass#skippingBeforeTest]. Имя класса и имя метода необходимо разделить с помощью #, а несколько значений можно разделить с помощью ,
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.IConfigurationAnnotation;

public class SampleAnnotationTransformer implements IAnnotationTransformer {

  @Override
  public void transform(
      IConfigurationAnnotation annotation,
      Class testClass,
      Constructor testConstructor,
      Method testMethod) {
    if (testMethod == null) {
      return;
    }

    String jvmValue = System.getProperty("methods.disable");
    if (jvmValue == null || jvmValue.trim().isEmpty()) {
      return;
    }

    List<String> methods = Arrays.asList(jvmValue.split(","));

    String fullyQualifiedMethodName =
        testMethod.getDeclaringClass().getCanonicalName() + "#" + testMethod.getName();
    if (methods.contains(fullyQualifiedMethodName)) {
      annotation.setEnabled(false);
    }
  }
}

Затем вы создаете файл набора xml, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="59840389_suite" parallel="false" configfailurepolicy="continue" verbose="2">
  <listeners>
    <listener
      class-name="com.rationaleemotions.stackoverflow.qn59840389.SampleAnnotationTransformer"/>
  </listeners>
  <test name="59840389_test">
    <classes>
      <class name="com.rationaleemotions.stackoverflow.qn59840389.SampleTestClass">
      </class>
    </classes>
  </test>
</suite>

Вот тестовый класс

import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class SampleTestClass {
  private boolean skipMarkedBeforeTest = false;

  @BeforeTest
  public void skippingBeforeTest() {
    skipMarkedBeforeTest = true;
  }

  @BeforeTest
  public void runnableBeforeTest() {
    System.err.println("runnableBeforeTest");
  }

  @Test
  public void beforeMethod() {
    Assert.assertFalse(skipMarkedBeforeTest);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...