我希望这种情况让我感到困惑。我想使用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完成此操作吗?如果是这样,请证明一些示例代码。提前谢谢!
答案 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
}
}