Насколько я понимаю, вы хотите отфильтровать методы тестирования для выполнения их именами и группами, к которым они принадлежат. Во-первых, нет специального решения для этого в чистом TestNG (в противном случае некоторые эксперты TestNG, такие как @juherr, ответили бы). Пропуск методов тестирования с реализацией InvokedMethodListener
оставил бы журналы, которые вы, вероятно, не хотите.
Я вижу два варианта.
В первом случае вы можете реализовать метод @Factory
, который может создавать тестовые классы с помощью Set<Method>
или Set<String>
в качестве параметра конструктора. В каждом из ваших тестовых классов вы должны проверить, должен ли выполняться метод (или его представление String
) в Set
. @Before
аннотированные или beforeInvocation
методы будут обрабатывать логику, будет ли выполняться данный метод. Кроме того, ваш testng.xml
будет указывать <groups>
элементов для запуска. Опять же, это может иметь недостаток в том, что вы оставляете Skipped: x
в своих журналах и отчетах.
Второй вариант - использовать Maven вместе с его Surefire Plugin. (Если вы не используете какой-либо инструмент сборки, например Gradle или Maven, тогда я уверен, что вы должны попробовать). Когда вы тестируете Maven, вы можете указать, какие группы и какие методы тестирования должны быть выполнены. Ваш pom.xml
должно быть так же, как следующее:
<!-- modelVersion, groupId, etc. -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
<!-- (...) -->
</plugins>
<!-- (...) -->
</build>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.10</version>
</dependency>
<!-- (...) -->
</dependencies>
Скажи, у вас есть тестовый класс вроде этого:
public class TestClass {
@Test(groups = {"firstGroup"})
public void firstMethod(Method method) {
assertEquals(1, 1);
System.out.println(method.getName());
}
@Test(groups = {"secondGroup"})
public void secondMethod(Method method) {
assertEquals(1, 1);
System.out.println(method.getName());
}
@Test(groups = {"secondGroup"})
public void thirdMethod(Method method) {
assertEquals(1, 1);
System.out.println(method.getName());
}
@Test(groups = {"secondGroup"})
public void fourthMethod(Method method) {
assertEquals(1, 1);
System.out.println(method.getName());
}
}
в вашем testng.xml
вы можете поместить информацию, какие группы для выполнения:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite Name">
<groups>
<run>
<include name="secondGroup"/>
</run>
</groups>
<test name="Default Test Name">
<classes>
<class name="TestClass"/>
</classes>
</test>
</suite>
И затем выполнить цель Maven, чтобы решить, какие методы вы выполняете:
mvn clean -Dtest=TestClass#thirdMethod+secondMethod test
Синтаксис для нескольких методов и нескольких классов можно найти here.
Выход:
Running TestClass
secondMethod
thirdMethod
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
Четвертый метод не был выполнен, даже если он принадлежит к secondGroup
. Если есть много методов для выполнения, вы можете написать для него собственный скрипт bash.
Невозможно (по крайней мере, для меня) фильтровать группы с помощью Maven и методы с TestNG.
Какое ожидаемое поведение? В вашем текущем файле пакета есть все, поэтому все будет запущено. – juherr
Я. На самом деле он будет выполнять любые методы, которые я включил. ИЛИ, он будет выполнять то, что когда-либо группы, о которых я упоминал. Мой вопрос: есть ли способ смешать оба? Здесь, в этом примере, мне нравится выполнять только групповую здравомыслие для методов, которые я включил. – Jeyabal
@ Джейбал, вы используете Maven? –