Вы можете очень хорошо сделать это, используя реализацию 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);
}
}