提供程序从测试套件向数据提供程序"parallel"值


@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

的完全限定类名

最新更新