无论是Selenium Appium这样的UI自动化测试,还是单元测试、接口测试这样的非UI自动化测试,都逃不开数据参数化的步骤,一般都会采用TestNg测试框架中的@DataProvider来实现。
今天我们分享下,如何使用excel来实现数据驱动,即测试数据存放在excel中的时候怎么达到循环驱动测试案例的效果。
本文采用最简单的csv的数据文件格式来结合TestNg框架演示,大家只需要讲案例代码整合到自己的测试代码中就可以了。
package test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* @author testfan.cn
*
*/
public class TestCsvWithDataProvider {
// 定义数据驱动
@DataProvider(name = "getData")
public static Object[][] getData() throws IOException {
return getTestData("c:\\test\\testData.csv");
}
// 测试案例绑定DataProvider后自动循环执行
@Test(dataProvider = "getData")
public void testSearch(String p1, String p2) {
System.out.println(p1 + " " + p2);
}
// 读取CSV文件的静态方法,使用CSV文件的绝对文件路径作为函数参数
public static Object[][] getTestData(String fileName) throws IOException {
List records = new ArrayList();
String record;
// 设定UTF-8字符集,使用带缓冲区的字符输入流BufferedReader读取文件内容
BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));
// file.readLine(); //跳过表头所在的行
// 遍历数据行并存储在名为records的ArrayList中,每一行records中存储的对象为一个String数组
while ((record = file.readLine()) != null) {
String fields[] = record.split(",");
records.add(fields);
}
// 关闭文件
file.close();
// 将存储测试数据的List转换为一个Object的二维数组
Object[][] results = new Object[records.size()][];
// 设置二位数组每行的值,每行是一个Object对象
for (int i = 0; i < records.size(); i++) {
results[i] = records.get(i);
// System.out.println(results[i]);
}
return results;
}
}
test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* @author testfan.cn
*
*/
public class TestCsvWithDataProvider {
// 定义数据驱动
@DataProvider(name = "getData")
public static Object[][] getData() throws IOException {
return getTestData("c:\\test\\testData.csv");
}
// 测试案例绑定DataProvider后自动循环执行
@Test(dataProvider = "getData")
public void testSearch(String p1, String p2) {
System.out.println(p1 + " " + p2);
}
// 读取CSV文件的静态方法,使用CSV文件的绝对文件路径作为函数参数
public static Object[][] getTestData(String fileName) throws IOException {
List records = new ArrayList();
String record;
// 设定UTF-8字符集,使用带缓冲区的字符输入流BufferedReader读取文件内容
BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));
// file.readLine(); //跳过表头所在的行
// 遍历数据行并存储在名为records的ArrayList中,每一行records中存储的对象为一个String数组
while ((record = file.readLine()) != null) {
String fields[] = record.split(",");
records.add(fields);
}
// 关闭文件
file.close();
// 将存储测试数据的List转换为一个Object的二维数组
Object[][] results = new Object[records.size()][];
// 设置二位数组每行的值,每行是一个Object对象
for (int i = 0; i < records.size(); i++) {
results[i] = records.get(i);
// System.out.println(results[i]);
}
return results;
}
}