testNG框架的四种传参方式
第一种:dataProvider方式,注意注解test的名称一定要对应类名称和方法名
package test;
public class DataProvider {
@org.testng.annotations.DataProvider
public static Object[][] testdataProvider(){
return new Object[][]{{1,2,3},{4,5,6}};
}
}
package test;
import org.testng.Assert;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class Dome04Test {
@Test(dataProvider = "testdataProvider",dataProviderClass = test.DataProvider.class)
public void testadd(int a ,int b,int c){
Dome04Test dome04 = new Dome04Test();
int d =dome04.add(a,b);
Assert.assertEquals(c,d);
}
public int add(int a,int b){
return a+b;
}
}
第二种,test.xml格式,注意类名称的配置和方法名称的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite">
<test name="FirstProject" enabled="true" >
<classes>
<class name="test.Dome05testXml">
<methods>
<include name="testadd" />
<parameter name="a" value="1" />
<parameter name="b" value="2" />
<parameter name="c" value="3" />
</methods>
</class>
</classes>
</test>
</suite>
package test;
import org.testng.Assert;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class Dome05testXml {
@Test
@Parameters({"a","b","c"})
public void testadd(int a ,int b,int c){
Dome04Test dome04 = new Dome04Test();
int d =dome04.add(a,b);
Assert.assertEquals(c,d);
}
public int add(int a,int b){
return a+b;
}
}
第三种:通过excel传参,重点是读取excel值
读取excel的工具类如下:
package excelUtil;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class ExcelUtil {
// public Workbook workbook;
public List<List<String>> readXls(String path) throws Exception {
InputStream is = new FileInputStream(path);
// HSSFWorkbook 标识整个excel
XSSFWorkbook hssfWorkbook = new XSSFWorkbook (is);
List<List<String>> result = new ArrayList<List<String>>();
int size = hssfWorkbook.getNumberOfSheets();
// 循环每一页,并处理当前循环页
for (int numSheet = 0; numSheet < size; numSheet++) {
// HSSFSheet 标识某一页
Sheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 处理当前页,循环读取每一行
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
// HSSFRow表示行
XSSFRow hssfRow = ((XSSFSheet) hssfSheet).getRow(rowNum);
int minColIx = hssfRow.getFirstCellNum();
System.out.println("minColIx = " + minColIx);
int maxColIx = hssfRow.getLastCellNum();
System.out.println("maxColIx = " + maxColIx);
List<String> rowList = new ArrayList<String>();
// 遍历改行,获取处理每个cell元素
for (int colIx = minColIx; colIx < maxColIx; colIx++) {
// HSSFCell 表示单元格
XSSFCell cell = hssfRow.getCell(colIx);
if (cell == null) {
continue;
}
rowList.add(cell.toString());
}
result.add(rowList);
}
}
return result;
}
/**
* 测试工具类是否成功
* @param args
*/
public static void main(String[] args) {
String path = "C:\\Users\\wanggang231\\Desktop\\123456.xlsx";
try {
List<List<String>> result = new ExcelUtil().readXls(path);
System.out.println(result.size());
for (int i = 0; i < result.size(); i++) {
List<String> model = result.get(i);
System.out.println("字段:" + model.get(0) + "--> 长度:" + model.get(1));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试类如下:
public class ExcelDomeTest {
@Test
public void excelData()throws Exception{
String path = "C:\\Users\\wanggang231\\Desktop\\123456.xlsx";
List<List<String>> resultlist = new ExcelUtil().readXls(path);
for (int i = 0;i<resultlist.size();i++){
List list = resultlist.get(i);
Assert.assertEquals(list.get(0),1);
}
}
}


第四种,通过数据库方式,就是利用数据库连接类进行查询数据库,然后再把获取到的数据进行处理遍历,得到想要的字段,赋给需要的方法进行测试。
第一步需要把数据库里面的数据读取进来放入到list<Map<String,Object>>中,把数据表中每一行数据看做一个对象放入list,但是由于每个字段都有对应的值所以每一行有是很多的map对象,则用此结构。(此处忽略链接数据库等代码)
public static List<Map<String,Object>> select(String sql) throws SQLException {
List<Map<String,Object>> resList = new ArrayList<>();
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
while (resultSet.next()){
Map<String,Object> lineMap = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
String key = metaData.getColumnLabel(i);
Object value = resultSet.getObject(i);
lineMap.put(key,value);
}
resList.add(lineMap);
}
return resList;
}
上面的代码查到了数据并且返回了一个list,由于我们的testNG框架在要求提供数据的时候必须是Object[][]这个类型的,所以我下面进行转换成返回object[][]
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
/**
*从数据库里面查询数据并且转换成Object[][]类型
*/
public class test {
@DataProvider(name = "data")
public static Object[][] testDButil(){
List<Map<String, Object>> select;
Object[][] objects = null;
try {
DBUtil.getConnection();
select = DBUtil.select("select order_code,order_name from orderdb");
objects = new Object[select.size()][2];
for (int i = 0; i <select.size() ; i++) {
objects[i][0] = select.get(i).get("order_code");
objects[i][1] = select.get(i).get("order_name");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return objects;
}
/*
*测试类
*/
@Test(dataProvider = "data")
public static void test(Object code,Object name){
if (code!=null&&name!=null){
System.out.println(code+":"+name);
Assert.assertEquals(code,"002");
Assert.assertEquals(name,"华为荣耀");
}
}
}
以下为测试结果:

好了以上就是testNG测试传参的四种方式,欢迎有不同看法的朋友进行批评和指正。

浙公网安备 33010602011771号