从测试套件向数据提供者提供“并行”价值

问题描述 投票:0回答:1
@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"
    }
]

你能建议我如何在没有讨厌的黑客的情况下实现这一目标吗(学习它也没有害处)?

java parallel-processing testng
1个回答
0
投票

目前 TestNG 没有您要求的这种支持(即能够从

<suite>
读取并行模式,然后为数据提供者应用并行执行策略)。

但是我们仍然可以使用下面列出的 TestNG 来做到这一点:

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

的完全限定类名
© www.soinside.com 2019 - 2024. All rights reserved.