我喜欢执行按方法和组筛选的测试。这可能在TestNG中吗?
例如。我有两个方法,下面有两个TestNG类。
Class - SampleJ1
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5
Class - SampleJ2
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5
我的自动化框架生成TestNG XML文件。如果我使用以下数据创建XML文件,它应该只执行所提到方法的健全组。
<groups>
<run>
<include name="sanity" />
</run>
</groups>
<test thread-count="12" name="Browser">
<classes>
<class name="SampleJ1">
<include method="Test1"/>
<include method="Test2"/>
<include method="Test3"/>
<include method="Test4"/>
</class>
<class name="SampleJ2">
<include method="Test1"/>
<include method="Test2"/>
<include method="Test3"/>
<include method="Test4"/>
</class>
</classes>
</test>
如果可能,请告诉我。
答案 0 :(得分:1)
据我了解,您希望过滤测试方法以按其所属的名称和组执行。
首先,在纯TestNG中没有特殊的解决方案(否则像@juherr这样的一些TestNG专家会回答)。使用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的方法过滤组是不可能的(至少对我而言)。