如何使用csv文件中的不同测试数据集在junit或testng中运行多个测试用例

时间:2016-08-30 16:46:29

标签: unit-testing selenium junit testng testng-dataprovider

我希望这种情况让我感到困惑。我想使用junit或testng运行一些测试用例,其中包含来自csv文件的不同数据集。我尝试过的代码片段如下所示,但它有效,

    private static CSVReader csvReader = null;
    @BeforeClass
        public static void setUp() {
            csvReader = new CSVReader(new FileReader(fileName));
        }

    @Test
    public void test1() {
        .......
        .......
        System.out.println(csvReader[0]);
    }

    @Test
    public void test2() {
        .......
        .......
        System.out.println(csvReader[1]);
    }

    @Test
    public void test3() {
        .......
        .......
        System.out.println(csvReader[2]);
    }

    @Test
    public void test4() {
        .......
        .......
        System.out.println(csvReader[3]);
    }

我的问题是我需要在不同的测试用例中使用每列的数据,如果我在csv文件中有多行,我需要再次迭代所有测试用例。我已经尝试过使用Theories和Datapoints,但它的工作原理是第一种情况与csv文件中的所有行一起运行,然后移动到下一个测试用例并再次运行csv中的所有行。

我希望解决方案使用第一行第一列test2(),第一行第二列test2(),第一行第三列test3(),第一行第四列test4(),然后同样需要用第二行迭代,依此类推。是否有可能像这样迭代测试用例?到目前为止,我可以通过多种方式迭代特定的测试用例。我的问题是,是否可以在一个具有一组数据的类中迭代所有测试,并再次使用来自csv的另一组数据重复该类。

我们可以使用junit或testng完成此操作吗?如果是这样,请证明一些示例代码。提前谢谢!

2 个答案:

答案 0 :(得分:1)

嗯,有parameterized tests ......你可以使用它们。

@RunWith(Parameterized.class)
public class YourTest {
    @Parameters
    public static Collection<Object[]> data() {
        try( FileReader read = new FileReader(fileName)) {
            CSVReader csvReader = new CSVReader(reader);

            List<CSVRecord> records = ... read data;

            Object[][] parameters = new Object[records.length][1];
            for(int i=0; i<records.length; i++) {
               parameters[i][0] = records.get(i);
            }
            return parameters;
        }
    }

    private CsvRecord record;  // [0] from the array goes here

    public YourTest (CsvRecord record) {
        this.record = record;
    }

    @Test
    public void test() {
         ...do something with the record
    }
}

答案 1 :(得分:1)

TestNG解决方案是:

public class YourTest {

    @DataProvider
    public static Object[][] data() {
        try( FileReader read = new FileReader(fileName)) {
            CSVReader csvReader = new CSVReader(reader);

            List<CSVRecord> records = ... read data;

            Object[][] parameters = new Object[records.length][1];
            for(int i=0; i<records.length; i++) {
               parameters[i][0] = records.get(i);
            }
            return parameters;
        }
    }

    @Test(dataProvider="data")
    public void test(CsvRecord record) {
         ...do something with the record
    }
}