@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-data文件就像下面这样,基本上是一组测试用例,通过库中的数据提供程序提供服务:
[
{
"test_id": 1,
"request": "some-json",
"response": "some-json"
},
{
"test_id": 2,
"request": "some-json",
"response": "some-json"
}
]
你能建议我如何做到这一点,而不是一个讨厌的黑客(也没有伤害学习)?
目前TestNG不支持您所要求的这种支持(即,能够从<suite>
读取并行模式,然后为数据提供程序应用并行执行策略)。
但是我们仍然可以使用TestNG,如下所示:
- 确保您正在使用最新发布的TestNG版本(截至今天它是
7.7.1
) - 创建
IAnnotationTransfromer
的实现,如下所示 - 使用
<listener>
标记或使用官方TestNG文档 中解释的服务加载器机制将此侦听器添加到套件文件中现在使用JVM参数
-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/服务/org.testng。ITestNGListener,它将命名实现(s)
这里的实现基本上是DataProviderAlteringListener