使用TestNG,可以在testng xml文件中包含/排除特定方法,如下所示:
<classes>
<class name="WebTest">
<methods>
<include name="testMethod1"/>
</methods>
</class>
</classes>
使用工厂提供WebTest
文件的实例时,说明您应该只在xml中包含工厂类,如下所示:
<classes>
<class name="WebTestFactory" />
</classes
问题在于,当使用工厂时,TestNG会运行类WebTest
的所有带注释的方法。我想做的是这样的事情:
<classes>
<class name="WebTestFactory">
<methods>
<include name="testMethod1"/>
</methods>
</class>
</classes>
其中testMethod1
是属于类WebTest
的方法,WebTest
返回WebTestFactory
的实例。
但是,每当我尝试此TestNG时,都会抱怨WebTestFactory
不包含testMethod1
。
使用带有TestNG的工厂时,有没有办法在XML文件中指定方法包含/排除?
答案 0 :(得分:0)
据我所知,无法从工厂过滤方法。当您在同一个类中混合出厂和测试方法时,会使用Include / Exclude。 我打开了一张关于需求的门票:https://github.com/cbeust/testng/issues/1253随意在那里发表评论。
作为一种变通方法,您可以尝试实现a method interceptor,这将根据您的业务逻辑(例如,系统属性)禁用测试方法。
答案 1 :(得分:0)
groupby
答案 2 :(得分:0)
我的目标有些不同,但也许对您的问题也有帮助。我想在一个新的类实例中运行每个测试方法。主要思想是,使用方法拦截器,您可以从没有依赖性的方法中定义要运行的方法。请注意,您可以通过上下文将变量从数据提供程序传递到拦截器。也许您可以使用它来定义要运行的方法。这是我的实现方式:
testng.xml
<test name="test">
<groups>
<run>
<include name="g1"/>
</run>
</groups>
<classes>
<class name="ParallelTest">
<methods>
</methods>
</class>
</classes>
</test>
课程
public class ParallelTest {
private final String testToRun;
@DataProvider
public static Object[][] dp(ITestContext context) {
return new Object[][]{
new Object[]{"test1", context},
new Object[]{"test2", context}
};
}
@Factory(dataProvider = "dp")
public ParallelTest(String testToRun, ITestContext context) {
this.testToRun = testToRun;
context.setAttribute("testToRun", testToRun);
}
@BeforeMethod(groups = "g1")
void beforeMethodG1() {
System.out.printf("class id: %s, group name: g1, test to run: %s\n", this, testToRun );
}
@BeforeMethod(groups = "g2")
void beforeMethodG2() {
System.out.println("g2");
}
@Test
(groups = "g1")
void test1() {
System.out.printf("class id: %s, group name: g1, test to run: %s, actual test: %s\n", this, testToRun, "test1" );
}
@Test
(groups = "g1")
void test2() {
System.out.printf("class id: %s, group name: g1, test to run: %s, actual test: %s\n", this, testToRun, "test2" );
}
@AfterMethod(alwaysRun = true)
void afterMethod(Method method) {
System.out.println("after " + method.getName());
}
}
拦截器
public class MethodInterceptor implements IMethodInterceptor {
@Override
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
List<String> methodNamesToRun = new ArrayList<>(methods.size());
List<Object> classInstancesToRun = new ArrayList<>(methods.size());
List<IMethodInstance> result = new ArrayList<>();
for (IMethodInstance methodInstance : methods) {
Object classInstance = methodInstance.getMethod().getInstance();
String methodName = methodInstance.getMethod().getQualifiedName();
if (!classInstancesToRun.contains(classInstance) && !methodNamesToRun.contains(methodName)) {
result.add(methodInstance);
classInstancesToRun.add(classInstance);
methodNamesToRun.add(methodName);
}
}
context.getAttribute("testToRun");
return result;
}
}
结果
class id: ParallelTest@20d3d15a, group name: g1, test to run: test1
class id: ParallelTest@20d3d15a, group name: g1, test to run: test1, actual test: test1
after test1
class id: ParallelTest@2893de87, group name: g1, test to run: test2
class id: ParallelTest@2893de87, group name: g1, test to run: test2, actual test: test2
after test2
答案 3 :(得分:0)
将 @Factory
表示法放在具有 dataProvider
属性的测试类的构造函数上,如下所示
public class TestFoo
{
static final String TEST_NAMES = "testNames";
@Nonnull
private final String testName;
@Factory(dataProvider = TEST_NAMES)
public TestFoo(@Nonnull String testName)
{
this.testName = testName;
}
@DataProvider(name = TEST_NAMES)
public static Object[][] testNames()
{
Object[][] names = new Object[][]{{"Foo"}, {"Bar"}, {"Baz"}};
return names;
}
@Test
public void nameTest()
{
System.out.println("Name = " + testName);
Assert.assertFalse(testName.isBlank());
}
}
输出:
Name = Bar
Name = Foo
Name = Baz
===============================================
Default Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================
Process finished with exit code 0