3

我正在使用 TestNG DataProvider 读取一个 datapool.xls 文件,该文件包含 1017 个测试用例和一个名为 ReadData 的类中的 214 个列。

然后,我将 214 个字符串参数传递到名为 EnterData 的单独类中的 @Test 注释中。

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

我在 @Test 中创建了一个 for 循环,只执行某些迭代(比如 1-10)的操作,总共只输入 10 个测试用例就可以工作。我的问题是,在运行结束时,它仍然显示“运行的总测试数: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 测试运行。

4

3 回答 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...) {

如果您没有同时运行测试,这将起作用。如果你是,你仍然可以使用ThreadLocals 进行小的修改来使用它。

于 2015-07-09T18:58:28.563 回答
1

您总是可以抛出 TestNGSkipException来将跳过的执行标记为跳过而不是通过。SkipException是一个不被识别为失败的特殊异常。

除此之外,您可以修改ReadAutoData.autodata以返回更少的数据集(行),例如文件中只有数千个数据集的前 10 个。

于 2015-07-08T20:54:56.593 回答
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);
}

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

于 2015-07-10T10:04:49.163 回答