使用TestNG的DataProvider跳过特定的测试迭代

3
我正在使用TestNG DataProvider来读取一个名为ReadData的类中包含1017个测试用例和214列的datapool.xls文件。
然后,我将这214个字符串参数传递到另一个名为EnterData的类中的@Test注释中。
@Test(dataProvider="autodata", dataProviderClass = ReadAutoData.class)
public void autoentry(String Quote, String Garage_Zip, etc...) {

我在@Test中创建了一个for循环,仅执行某些迭代(比如1-10),这确实可以通过总共只输入10个测试用例来实现。但是问题在于,在运行结束时,它仍然显示“Total tests run: 1017”,而不仅仅是由于for循环而实际执行的那10个测试用例。

// Start for loop for entering auto policies
for (int a = start; a <= end; a++)
{
    if (quote == a)
    {       
        System.out.println("Tier = " + Tier);                       
    } 
}

我知道为什么它显示运行的测试总数是整个数据池,因为它在技术上通过并运行了数据池中的所有内容,我只是不知道如何只显示实际运行的测试数量。
基本上,我正在寻找一种可能将@Test注释本身放在for循环中的方法?...
编辑:
这是我目前用于读取ReadAutoData类中数据池的代码:
@DataProvider(name = "autodata")
public static Object[][] autodata() {
Object[][] arrayObject = getExcelData("C:/dev/AutoDP.xls","NON-COMBO-DP");
return arrayObject;
}

/**
 * @param File Name
 * @param Sheet Name
 * @return
 */
public static String[][] getExcelData(String fileName, String sheetName) {
    String[][] arrayExcelData = null;
    try {
        FileInputStream fs = new FileInputStream(fileName);
        Workbook wb = Workbook.getWorkbook(fs);
        Sheet sh = wb.getSheet(sheetName);

        int totalNoOfCols = sh.getColumns();
        int totalNoOfRows = sh.getRows();

        arrayExcelData = new String[totalNoOfRows-1][totalNoOfCols];

        for (int i= 1 ; i < totalNoOfRows; i++) {

            for (int j=0; j < totalNoOfCols; j++) {
                arrayExcelData[i-1][j] = sh.getCell(j, i).getContents();
            }

        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        e.printStackTrace();
    } catch (BiffException e) {
        e.printStackTrace();
    }
    return arrayExcelData;
}

编辑2:

目前为止,在1017个测试用例中,我已经通过在for循环的开头添加以下内容,使其显示1007个跳过:

// Start for loop for entering auto policies
    for (int a = start; a <= end; a++)
    {
        if (quote < start) throw new SkipException("Testing skip.");
        if (quote > end) throw new SkipException("Testing skip.");

        if (quote == a)
        {

            System.out.println("Starting Iteration = " + Quote);

然而,它仍然显示1017个测试已运行。

你是否可以显示已执行的10个rest跳过? - Shamik
是的,那正是我想要的。 - Dustin N.
你为什么不把测试迭代的决策逻辑放到数据提供程序中,从而只发送你想要运行的10个测试呢? - Mrunal Gosar
因为我不确定如何告诉@DataProvider只获取哪些行。我目前正在尝试实现Crazy的方法。 - Dustin N.
您可以在测试中实现向DataProvider发送索引。您可以查看此文章 https://www.pawangaria.com/post/testng/limit-certain-test-iterations-in-testng-dataprovider/ - user1344022
3个回答

4

唯一能够达到这个目标的方法就是理解TestNG框架的执行方式。

这意味着:

  1. SkipException不是解决方案,因为它始终会计算所有测试用例的数量,即使它们被跳过了。
  2. 测试用例的数量是由@DataProvider方法返回的行数确定的。

解决方案是从被@DataProvider注释的方法中返回正确的测试用例数量。

public class ReadAutoData {
    private static int indexFrom;
    private static int indexTo;

    @DataProvider(name = "autodata")
    public static Object[][] autodata() {
        // you should probably cache this into static variable
        Object[][] arrayObject = getExcelData("C:/dev/AutoDP.xls","NON-COMBO-DP"); 

        return java.util.Arrays.copyOfRange(arrayObject, indexFrom, indexTo);
    }

    public Class<?> autoDataWithinRange(int from, int to) {
        indexFrom = from;
        indexTo   = to;

        return ReadAutoData.class;
    }
}

@Test(dataProvider="autodata", dataProviderClass = ReadAutoData.autoDataWithinRange(0, 10))
public void autoentry(String Quote, String Garage_Zip, etc...) {

如果您不同时运行测试,这将起作用。 如果是并发运行测试,则仍可以使用它,只需使用ThreadLocal进行小的修改即可。


好的,我已经尝试实现了这个功能,但是当我按照你所描述的将dataProviderClass传递给@Test时,我遇到了以下错误:“注释属性Test.dataProviderClass的值必须是类字面量”。 - Dustin N.
你是对的。在这种情况下,你将不得不稍微以不同的方式来做,但核心仍然是一样的。 - Crazyjavahacking
明白了!!!非常感谢你的帮助。通过这个,我学到了不少知识。现在我已经让@DataProvider读取.properties文件从数据池获取迭代次数,并将其传递到indexFrom(-1)和indexTo中,它像梦一样运行着。 - Dustin N.

1
你可以始终抛出 TestNG 的“SkipException”来标记跳过的执行,而不是将其标记为已通过。 "SkipException" 是一种特殊的异常,不被视为失败。
除此之外,你可以修改“ReadAutoData.autodata”以返回较少的数据集(行),例如在文件中仅返回前 10 个,而不是你拥有的数千个。

我喜欢你的想法,但我似乎无法正确实现它。当我使用SkipException时,它会运行10个测试用例,但显示所有1017个被跳过。我不确定如何只加载我想要运行的测试用例。比如说,我想从20开始到30等等... - Dustin N.
我已经让它至少显示了跳过了多少个测试。问题是它仍然显示所有1017个测试都已运行。 - Dustin N.

0
如何通过实现IInvokedMethodListener接口并实现方法beforeInvocation(IInvokedMethod method, ITestResult tr)来创建监听器类?在这个方法中,您可以获取测试结果对象并获取参数,然后决定对该数据集执行什么操作。
Object [] params = tr.getParameters();
// put some logic on params and decide
if ( params is something ) {
tr.setStatus(ITestResult.SKIP);
}

我假设你想根据参数运行或不运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接