在 TestNG 中从逗号分隔的 jenkins 字符串参数开始并行运行

问题描述 投票:0回答:1

目前我正在使用这样的数据提供程序

static Object[][] dataProvider() {
       return new Object[][]{
                [a],
                [b],
                [c],
       }
}

在 build.gradle 中有这样的 testNG 选项,

 useTestNG() {
        options ->
            options.parallel = 'tests'
            options.threadCount = 3
}

并进行这样的测试,

 @Test(dataProvider = "dataProvider", dataProviderClass = RunIdProvider.class)
void testFunction(String variable) {
 // do something
}

这样做可以让我并行启动 3 个测试,每个测试使用数据 a 或 b 或 c。

我想在 jenkins 中传入一个字符串参数,比如 -

a,b,c
并且应该从 testNG 并行启动 3 个测试,每个测试使用值 a 或 b 或 c 之一。

更具体地说,启动的并行测试数量应基于字符串中逗号分隔值的数量 - 这意味着如果我传入 a、b、c、d - 它应该并行启动 4 个测试。

这可能吗?以前有人这样做过吗?非常感谢任何例子。谢谢!

testng testng-dataprovider
1个回答
0
投票

您可能正在寻找这样的东西:

注:

  • 数据提供者尝试在套件文件中查找名为
    csv_values
    的参数,并仅在找到时尝试将其解析为 csv。如果未找到,则默认为某些默认值。
  • 数据提供者假设将要使用其数据的测试方法仅需要 1 个参数,并且参数类型为
    String
  • 您的数据提供程序现在并行工作,其数据集基于从套件传递的参数。

以下是包含能够将 csv 转换为数据集的动态数据提供程序的测试类:

import org.testng.ITestContext;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

public class SampleTestCase {

    @DataProvider(name = "dp", parallel = true)
    public static Object[][] dataProvider(ITestContext context) {
        Map<String, String> parameters = context.getCurrentXmlTest().getAllParameters();
        String value = Optional.ofNullable(parameters.get("csv_values")).orElse("");
        if (value.isEmpty()) {
            return new Object[][]{
                    {"z"}
            };
        }
        List<String> csv = Arrays.stream(value.split(",")).collect(Collectors.toList());
        Object[][] result = new Object[csv.size()][1];
        AtomicInteger index = new AtomicInteger(0);
        csv.forEach(it -> result[index.getAndIncrement()][0] = it);
        return result;
    }

    @Test(dataProvider = "dp")
    public void testMethod(String value) {
        System.err.println("Thread Id: " + Thread.currentThread().getId()  + ", Value = " + value);
    }
}

套件文件如下所示:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="78111465_suite" verbose="2">
    <parameter name="csv_values" value="a,b,c,d,e,f"/>
    <test name="78111465_test">
        <classes>
            <class name="com.rationaleemotions.so.qn78111465.SampleTestCase"/>
        </classes>
    </test>
</suite>

这是执行输出

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
...
... TestNG 7.9.0 by Cédric Beust ([email protected])
...

Thread Id: 20, Value = f
Thread Id: 19, Value = e
Thread Id: 15, Value = a
Thread Id: 17, Value = c
Thread Id: 16, Value = b
Thread Id: 18, Value = d
PASSED: com.rationaleemotions.so.qn78111465.SampleTestCase.testMethod("f")
PASSED: com.rationaleemotions.so.qn78111465.SampleTestCase.testMethod("e")
PASSED: com.rationaleemotions.so.qn78111465.SampleTestCase.testMethod("b")
PASSED: com.rationaleemotions.so.qn78111465.SampleTestCase.testMethod("d")
PASSED: com.rationaleemotions.so.qn78111465.SampleTestCase.testMethod("c")
PASSED: com.rationaleemotions.so.qn78111465.SampleTestCase.testMethod("a")

===============================================
    78111465_test
    Tests run: 1, Failures: 0, Skips: 0
===============================================


===============================================
78111465_suite
Total tests run: 6, Passes: 6, Failures: 0, Skips: 0
===============================================


Process finished with exit code 0
© www.soinside.com 2019 - 2024. All rights reserved.