如何 运行 在 junit 或 testng 中使用来自 csv 文件的不同测试数据集进行多个测试用例
how to run multiple test cases in junit or testng with different set of test data from csv file
我希望这种情况让我有点困惑。我想 运行 一些使用 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,但它的工作方式是第一个案例 运行s 包含 csv 文件中的所有行,然后移动到下一个测试用例,然后再次 运行s 包含 csv 中的所有行。
我想要 运行 test1() 的解决方案,第一行第一列,test2() 第一行第二列,test3() 第一行第三列,test4() 第四列第一行的列然后需要用第二行迭代,依此类推。是否可以像这样迭代测试用例?据我搜索,我们可以通过多种方式迭代特定的测试用例。我的问题是,是否可以用一组数据迭代 class 中的所有测试,然后用来自 csv.
的另一组数据再次重复 class
我们可以使用 junit 或 testng 来完成吗?如果是这样,请证明一些示例代码。提前致谢!
好吧,有 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
}
}
而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
}
}
我希望这种情况让我有点困惑。我想 运行 一些使用 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,但它的工作方式是第一个案例 运行s 包含 csv 文件中的所有行,然后移动到下一个测试用例,然后再次 运行s 包含 csv 中的所有行。
我想要 运行 test1() 的解决方案,第一行第一列,test2() 第一行第二列,test3() 第一行第三列,test4() 第四列第一行的列然后需要用第二行迭代,依此类推。是否可以像这样迭代测试用例?据我搜索,我们可以通过多种方式迭代特定的测试用例。我的问题是,是否可以用一组数据迭代 class 中的所有测试,然后用来自 csv.
的另一组数据再次重复 class我们可以使用 junit 或 testng 来完成吗?如果是这样,请证明一些示例代码。提前致谢!
好吧,有 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
}
}
而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
}
}