testng和excel数据驱动
一、maven项目添加插件
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>compile</scope> </dependency>
二、关于testng中各个组件的执行顺序
参考 https://blog.csdn.net/cunchi4221/article/details/107475221
依赖:@Test(dependsOnMethods = {"你的依赖函数"})
忽略:@Test(enable = false)
import org.testng.Assert; import org.testng.annotations.*; public class TC1 { @BeforeClass public void beforeClass() { System.out.println("BeforeClass,开始执行一次"); } @AfterClass public void afterClass() { System.out.println("AfterClass,结束执行一次");} @BeforeMethod public void beforeTest() { System.out.println("BeforeMethod,每个用例前执行一次"); } @AfterMethod public void afterMethod() { System.out.println("AfterMethod,每个用例后执行一次"); } @BeforeGroups("mark") public void beforeGroups() { System.out.println("BeforeGroups,group前执行一次"); } @AfterGroups("mark") public void afterGroups() { System.out.println("AfterGroups,group后执行一次"); } @Test(groups = "mark", priority = 2) // 将该case 的groups标注为 mark;priority表示运行顺序 public void case1() { Assert.assertEquals(1, 1); } @Test(dataProvider = "dp", priority = 1) // dataProvider 获取数据驱动 public void case2(Integer n, String s) { System.out.println("case2:"+n+s); } @DataProvider // 做数据驱动,数据源文件可以是EXCEL,XML,甚至可以是TXT文本 public Object[][] dp() { System.out.println("Inside @DataProvider"); return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" },}; } } /* 执行结果如下: BeforeClass,开始执行一次 Inside @DataProvider BeforeMethod,每个用例前执行一次 case2:1a AfterMethod,每个用例后执行一次 BeforeMethod,每个用例前执行一次 case2:2b AfterMethod,每个用例后执行一次 BeforeGroups,group前执行一次 BeforeMethod,每个用例前执行一次 AfterMethod,每个用例后执行一次 AfterGroups,group后执行一次 AfterClass,结束执行一次 =============================================== Default Suite Total tests run: 3, Failures: 0, Skips: 0 =============================================== */
读取Excel的数据驱动poi,参考:java接口自动化测试实战002----测试数据封装及ExcelUtil优化 - 搁浅的青木儿 - 博客园 (cnblogs.com)
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
读取Excel的工具类
public class ExcelUtil_2 { //读取连续行列表格文件,传入开始的行列索引 public static Object[][] getDatas(String excelPath,int rowStartNum,int rowEndNum,int cellStartNum,int cellEndNum){ //新建二维数组存储读取的数据,二维数组创建:object[][] datas=new Object[7][2]; Object[][] datas=null; try { //获取workbook对象 Workbook workbook=WorkbookFactory.create(new File(excelPath)); //获取Sheet对象 Sheet sheet=workbook.getSheet("Sheet1"); datas=new Object[rowEndNum-rowStartNum+1][cellEndNum-cellStartNum+1]; for (int i =rowStartNum; i <=rowEndNum; i++) { //根据行索引获取行 Row row=sheet.getRow(i); //函数中传入的是索引值 ,所以此处不需要减1 for (int j =cellStartNum; j <=cellEndNum; j++) { //根据列索引获取列,并指定单元格数据为空的策略,否则单元格为空时,会报空指针异常。 Cell cell=row.getCell(j,MissingCellPolicy.CREATE_NULL_AS_BLANK); //将列设置为字符串类型 cell.setCellType(CellType.STRING); //获取单元格数据 String value=cell.getStringCellValue(); //将单元格数据存储到数组中 datas[i-rowStartNum][j-cellStartNum]=value; } } } catch (Exception e) { e.printStackTrace(); } return datas; }
修改数据提供者中的函数调用形式,如下:
@DataProvider public Object[][] datas(){ String excelPath="src/test/resources/测试用例_V1.xlsx"; Object[][] datas= ExcelUtil_2.getDatas(excelPath,1,7,5,6);//传入开始和结束的行列索引,注意不是行列号 return datas; }
假设Excel中某列是请求参数,读取到数据后,需要json包或者fastjson转为json对象,同时请求工具类中的入参也应该为json对象
// 解析JSON请求数据,并发起请求 JSONObject jsonRequest = new JSONObject(requestData); String actualResult = sendLoginRequest(jsonRequest);
三、关于测试套件
上面有TC1类,补下下面xml用到的Suite类、TC2类以及TC2引用到的Utils类
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
public class Suite {
@BeforeSuite
public void suiteBefore(){
System.out.println("测试BeforeSuite");
}
@AfterSuite
public void suiteAfter(){
System.out.println("测试AfterSuite");
}
}
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TC2 {
@Test(dataProvider = "dp",groups = "1")
public void test_add(Integer x, Integer y) {
Utils u = new Utils();
Assert.assertEquals(u.add(x, y), x + y);
}
@Test(dataProvider = "dp",groups = "2")
public void test_subtract(Integer x, Integer y) {
Utils u = new Utils();
Assert.assertEquals(u.subtract(x, y), x - y);
}
@Test(dataProvider = "dpName")
public void test_setName(String s) {
Utils.setName(s);
Assert.assertEquals(Utils.NAME, s);
}
@DataProvider
public Object[][] dp() {
return new Object[][] { new Object[] { 1, 1 }, new Object[] { 2, 2 }, };
}
@DataProvider
public Object[][] dpName() {
return new Object[][] { new Object[] { "Utils" }, new Object[] { "MyUtils" }, };
}
}
public class Utils { public static String NAME = ""; public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { return x - y; } public static void setName(String s) { System.out.println("Setting NAME to " + s); NAME = s; } }
下面是一个xml的测试套件,文件名不限。在xml文件上,右键run testng.xml即可,verbose参数是测试结果详细程度
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="TestAll"> <test name="测试套件"> <classes> <class name="com.example.demo.testng.Suite"/> </classes> </test> <!-- <test name="测试用例,include-包含、exclude-排除">--> <!-- <classes>--> <!-- <class name="com.example.demo.testng.TC1">--> <!-- <methods>--> <!-- <include name="case1"/>--> <!-- <exclude name="case2"/>--> <!-- </methods>--> <!-- </class>--> <!-- </classes>--> <!-- </test>--> <test name="测试group,include-包含、exclude-排除" verbose="2"> <groups> <run> <exclude name="1" /> <include name="2" /> </run> </groups> <classes> <class name="com.example.demo.testng.TC2" /> </classes> </test> <!-- <test name="测试类">--> <!-- <classes>--> <!-- <class name="com.example.demo.testng.TC1"/>--> <!-- <class name="com.example.demo.testng.TC2"/>--> <!-- </classes>--> <!-- </test>--> <!-- <test name="测试目录">--> <!-- <packages>--> <!-- <package name="com.example.demo.testng.*"/>--> <!-- </packages>--> <!-- </test>--> </suite>
四、默认的测试报告
IDEA默认不会生成报告,这里我们通过设置使用默认的报告模板来生成报告。
设置方法:Run——Edit Configurations,再按如下截图操作。
设置完成后,运行第三部的xml测试套件,生成的测试报告在 test-output 目录下,实际打开报告有乱码,没找到解决办法。
(如果用浏览器打开则不会乱码,如果是从idea跳转到浏览器则会乱码,2种方式在浏览器打开的url也不同,不明白。
如果在html报告中添加utf-8的说明,则idea跳转到浏览器也不会乱码)

一个只会点点点的测试,有疑问可以在测试群(群号:330405140)问我

浙公网安备 33010602011771号