@DataProvider(name="testData", parallel = true}
Object[][] data() {
return new Object[][]{{"one"}, {"two"}}; // test data e.g., but its actually read in a @BeforeTest method and returned here.
}
这就是我们编写数据提供程序的方式。但是当我想根据测试套件中定义的参数来决定何时使其并行或不并行时,我遇到了一个问题,该参数的值我只能在运行时读取,但注释需要一个常量。
因为我正在修改一个现有的测试库,用户只需要添加一个测试套件和测试数据文件(请求和响应的数组),我试图启用他们的测试用例的并行运行(在具有价值的数据提供者中使用并行从测试套件中读取)。
所以,测试套件会有像这样的信息
<hostName>google.com</hostName>
<port>8443</port>
<protocol>https</protocol>
同理,会加
<runInParallel>true</runInParallel>
测试数据文件将如下所示,它基本上是一组测试用例,并通过库中的数据提供者提供服务:
[
{
"test_id": 1,
"request": "some-json",
"response": "some-json"
},
{
"test_id": 2,
"request": "some-json",
"response": "some-json"
}
]
你能建议我如何在没有讨厌的黑客的情况下实现这一目标吗(学习它也没有害处)?
目前 TestNG 没有您要求的这种支持(即能够从
<suite>
读取并行模式,然后为数据提供者应用并行执行策略)。
但是我们仍然可以使用下面列出的 TestNG 来做到这一点:
7.7.1
)IAnnotationTransfromer
的实现,如下所示<listener>
标签或使用 官方 TestNG 文档中解释的服务加载器机制将此侦听器添加到您的套件文件-Ddp.parallel.mode
TestNG 不支持读取套件文件参数并将其应用于
IAnnotationTransformer
的原因是因为先调用IAnnotationTransformer
以帮助TestNG 收集所有要执行的方法,然后才执行任何其他套件侦听器被调用。目前我们只能通过任何套件监听器读取套件参数。
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.IDataProviderAnnotation;
public class DataProviderAlteringListener implements IAnnotationTransformer {
@Override
public void transform(IDataProviderAnnotation annotation, Method method) {
boolean runInParallel = Boolean.getBoolean("dp.parallel.mode");
if (runInParallel) {
annotation.setParallel(true);
}
}
}
引用服务加载器部分的文档(为了这个答案的完整性)
在该位置创建一个文件 META-INF/services/org.testng.ITestNGListener,它将命名 实施
这里的实现基本上是
DataProviderAlteringListener
的完全限定类名