当前位置: 首页 > 知识库问答 >
问题:

使用TestNG DataProvider跳过某些测试迭代

晏炳
2023-03-14

我正在使用TestNG数据提供程序读取数据池。xls文件,在名为ReadData的类中包含1017个测试用例和214列。

然后,我将214个String参数传递到名为Enterprise Data的单独类中的@Test注释中。

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

我在@Test中创建了一个for循环,只执行ceratin迭代的操作(比如1-10),它总共只输入10个测试用例。我的问题是,在运行结束时,它仍然显示“Total tests run:1017”,而不是仅显示10个测试,因为for循环实际上做了任何事情。

// 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:

// 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个测试正在运行。

共有3个答案

楚承天
2023-03-14

通过在调用之前实现方法(IINVokedMethodMethodListener)和实现方法(IINVokedMethodMethod method,ITestResult tr)来创建监听器类,您可以获取测试结果对象并获取参数,并决定对该数据集执行什么操作。

Object [] params = tr.getParameters();
// put some logic on params and decide
if ( params is something ) {
tr.setStatus(ITestResult.SKIP);
}

我假设您想运行还是不运行取决于参数。

笪德华
2023-03-14

您始终可以抛出TestNG的SkipException,将跳过的执行标记为跳过而不是通过<代码>跳过异常(code>SkipException)是一种特殊异常,不会被识别为故障。

除此之外,您还可以修改ReadAutoData。autodata可返回较少的数据集(行),例如,仅返回文件中数千行中的前10行。

戎洛华
2023-03-14

实现这一点的唯一方法是了解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进行小修改来使用它。

 类似资料:
  • 问题内容: 有没有办法限制来自mysqldump命令的某些表? 例如,我将使用以下语法 仅 转储table1和table2: 但是,有没有类似的方法来转储 除 table1和table2 之外的 所有表?我没有在mysqldump文档中找到任何东西,所以暴力破解(指定所有表名)是唯一的方法吗? 问题答案: 您可以使用--ignore- table 选项。所以你可以做 之后没有空格(这不是错字)。

  • 我正在使用TestNG进行单元测试。我使用@BeforeMethod保存记录,然后执行更新、搜索、删除测试。 我的测试类如下所示:

  • 问题内容: 是否可以跳过/排除某些测试的运行? 我有大量的集成类型测试,这些调用称为标准服务测试编写的rest服务,并使用运行。开发新功能时,有时可以跳过某些测试,例如,如果该新功能尚未部署在测试服务器上,并且我仍想运行所有现有测试(那些进行测试的新测试除外),则有时会有用新功能)。 我知道,但是我不想指定我要运行的所有测试,那将是一长串。同时,我无法编写排除测试的正则表达式。 另一个选择是不提交

  • 我正在使用Maven 2.2.1,为了构建我的项目,我使用了以下命令 但是,构建失败了,说它找不到一个工件。然而,当我使用: 一切正常。 到目前为止,我一直认为这两个命令是等效的。然而,这个链接似乎表明,Dmaven。测验skip=true也会跳过编译测试用例。 然而,这仍然不能向我解释为什么一个命令有效,而另一个命令无效。如果有人能向我解释这一点,我将不胜感激。

  • 我正在寻找一种方法来跳过多构建项目中某个项目的测试。我不想使用gradle构建-x测试,因为这样它将跳过所有子项目的测试。 根 子P1 build.gradle 构建。格拉德尔 构建。格拉德尔 我只想跳过“Sub P3”的测试 我可以将项目(子P3)生成文件配置为跳过测试吗?

  • 问题内容: 是否可以跳过测试目录。例如,鉴于下面的结构,是否可以测试mypackage,mypackage / other和mypackage / net,但不能测试mypackage / scripts?我的意思是无需为每个脚本编写go test命令(例如,去测试;去测试网;去测试其他) 问题答案: Go test带有要在命令行上测试的软件包列表(请参阅参考资料),因此您可以通过一次调用来测试任