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");
    }
}
View Code
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" }, };
    }

}
View Code
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;
    }

}
View Code

下面是一个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跳转到浏览器也不会乱码)

 

posted @ 2021-09-26 18:34  whitewall  阅读(156)  评论(0)    收藏  举报