java接口自动化测试实战002----测试数据封装及ExcelUtil优化

发布时间 2023-12-22 21:26:37作者: 搁浅的青木儿

一、利用testNG测试框架进行封装

1、封装实现

新建测试类,类中新增多个方法,每个方法存储一条测试数据并调用HttpUtl类中的doGet或doPost方法。缺点:代码复杂、繁琐,且不适用测试数据量大的情况。

2、封装步骤

(1)maven的pom.xml文件中添加testNG测试框架的依赖,如下所示:

 <!-- https://mvnrepository.com/artifact/org.testng/testng -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8.8</version>
            <scope>test</scope>
        </dependency>

(2)testNG配置文件中配置测试类,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <test thread-count="5" name="Login">
    <classes>
      <class name="testInterface.test_V1.login_v11"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

(3)新建在testNG配置文件中配置的测试类,并进行数据封装,每条数据对应一个测试方法 ,如下所示:

public class login_v1 {
    @Test
     public void login_1() {
         String url="http://127.0.0.1:58088/api/user/smsCodeLogin";
         String mobile="13205869415";
         String smsCode="9999";
          Map<String,String> parameter=new HashMap<String,String>();
          parameter.put("mobile",mobile);
          parameter.put("smsCode",smsCode);
          HttpUtil1.doPost(url,parameter);
     }
    @Test
     public void login_2() {
         String url="http://127.0.0.1:58088/api/user/smsCodeLogin";
         String mobile="123";    //手机号错误
         String smsCode="9999";
          Map<String,String> parameter=new HashMap<String,String>();
          parameter.put("mobile",mobile);
          parameter.put("smsCode",smsCode);
          HttpUtil1.doPost(url,parameter);
     }
    @Test
     public void login_3() {
         String url="http://127.0.0.1:58088/api/user/smsCodeLogin";
         String mobile="13205869415";
         String smsCode="11";   //密码错误
          Map<String,String> parameter=new HashMap<String,String>();
          parameter.put("mobile",mobile);
          parameter.put("smsCode",smsCode);
          HttpUtil1.doPost(url,parameter);
     }
}

 

二、利用testNG的DataProvider进行数据封装

1、封装实现

   新建一个保存数据的方法,在方法中利用数组存储测试数据并返回数组格式数据。再使用testNG中的DataProvider进行数据调用。缺点:不适于存储测试数据的数据量比较大或字段项比较多的情况。

2、实现步骤

  • 新建一个保存数据的datas方法,在方法中利用数组存储测试数据并返回数组格式数据;
  • 通过在保存数据的方法上添加@DataProvider和在测试方法上添加@Test(dataProvider=”datas”进行数据调用,如下所示:
public class login_v2 {
    @Test(dataProvider="datas")
     public void login(String mobile,String smsCode) {
        String url="http://127.0.0.1:58088/api/user/smsCodeLogin";
          Map<String,String> parameter=new HashMap<String,String>();
          parameter.put("mobile",mobile);
          parameter.put("smsCode",smsCode);
          HttpUtil1.doPost(url,parameter);
     }
    @DataProvider
    public Object[][] datas(){
        Object[][] datas= {
                {"13265626352","6666"},
                {"","6666"},
                {"12345689562","6666"},
                {"13265","6666"},
                {"13203890553","6666"},
                {"13265626352","7777"},
                {"13265626352",""},
        };
        return datas;
    }
}

 

三、通过EXCEL表格存储测试数据进行封装

1、封装实现

 将测试数据存储在EXCEL表格,通过POI技术读取EXCEL表格文件中的测试数据实现数据的调用。

2、实现步骤

(1)在EXCEL表格设计测试数据,并将其放入项目src/test/resources目录下,如下图所示:

 

 

(2)在Maven的配置文件pom.xml中配置poi对应的依赖,如下所示:

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

(3)新建读取文件的类ExcelUtil类,编写相应代码,读取EXCEL表格文件中的测试数据,如下所示:

public class ExcelUtil_1 {
  public static Object[][] getDatas(){
      String excelPath="src/test/resources/测试用例_V1.xlsx";
      //新建二维数组存储读取的数据,二维数组创建: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[7][2];
        for (int i =1; i <=7; i++) {
            //获取行
            Row row=sheet.getRow(i);
            for (int j = 5; j <=6; j++) {
            //获取列,并指定单元格数据为空的策略,否则单元格为空时,会报空指针异常。
            Cell cell=row.getCell(j,MissingCellPolicy.CREATE_NULL_AS_BLANK);
            //将列设置为字符串类型
            cell.setCellType(CellType.STRING);
            //获取单元格数据
            String value=cell.getStringCellValue();
            //将单元格数据存储到数组中
            datas[i-1][j-5]=value;            
            }    
        }    
    } catch (Exception e) {
        e.printStackTrace();
    }
    return datas;  
  }
  
  //验证读取函数是否可以成功读取。
    /*
     * public static void main(String[] args) { 
     * Object[][] data=getDatas();
     *  for(Object[] objects : data) {
     *   System.out.print("["+objects+"]\n");
     *    for (Object object : objects) { 
     *    System.out.print("["+object+"]\n");
     *     }
     *   }
     * }
     */
}

(4)在之前存储数据的函数datas中调用读取类ExcelUtil类对应的函数datas,如下所示:

public class login_v3 {
    //调用ExcelUtil_1
    @Test(dataProvider="datas")
     public void login(String mobile,String smsCode) {
        String url="http://127.0.0.1:58088/api/user/smsCodeLogin";
          Map<String,String> parameter=new HashMap<String,String>();
          parameter.put("mobile",mobile);
          parameter.put("smsCode",smsCode);
          HttpUtil1.doPost(url,parameter);
     }
    @DataProvider
    public Object[][] datas(){
        Object[][] datas= ExcelUtil_1.getDatas();
        return datas;

    } 
}

 

四、读取文件类优化之处理表格中数据行列不固定且连续

1、实现思想

     当需要读取测试文件中数据的行列连续且不固定时,我们可以将开始的行列和结束的行列以及文件路径以参数的形式传入读取文件函数中,在调用此函数时再设置开始的行列和结束的行列。

2、实现步骤

  (1)修改读取文件函数,以参数的形式传入开始的行列和结束的行列以及文件路径,如下所示:

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

(2)修改数据提供者中的函数调用形式,如下所示:

    @DataProvider
    public Object[][] datas(){
        String excelPath="src/test/resources/测试用例_V1.xlsx";
        Object[][] datas= ExcelUtil_2.getDatas(excelPath,1,7,5,6);//传入开始和结束的行列索引,注意不是行列号
        return datas;
    }

 

五、读取文件类优化之处理表格中数据行列不连续情况

1、实现思想

当需要读取测试文件中数据的行列不连续时,我们可以读取函数中传入的开始行列和结束行列换为行数组和列数组,然后将要调用的行列存储到数组中,在调用读取函数时直接传入对应的数组。

2、实现步骤

(1)修改读取文件函数,以参数的形式传入行数组和列数组以及文件路径,如下所示:

public static Object[][] getDatas(String excelPath,String Sheetname ,int[] rowNum,int[] cellNum){
      
      //新建二维数组存储读取的数据,二维数组创建:object[][] datas=new Object[7][2];
      Object[][] datas=null;
      try {
        //获取workbook对象
        Workbook workbook=WorkbookFactory.create(new File(excelPath));
        //获取Sheet对象
        Sheet sheet=workbook.getSheet(Sheetname);
        datas=new Object[rowNum.length][cellNum.length];
        for (int i =0; i <rowNum.length; i++) {//注意去掉=
            //获取行
            Row row=sheet.getRow(rowNum[i]);//获取的是数组中的行索引
            for (int j =0; j <cellNum.length; j++) {
            //获取列,并指定单元格数据为空的策略,否则单元格为空时,会报空指针异常。
            Cell cell=row.getCell(cellNum[j],MissingCellPolicy.CREATE_NULL_AS_BLANK);
            //将列设置为字符串类型
            cell.setCellType(CellType.STRING);
            //获取单元格数据
            String value=cell.getStringCellValue();
            //将单元格数据存储到数组中
            datas[i][j]=value;            
            }    
        }    
    } catch (Exception e) {
        e.printStackTrace();
    }
    return datas;  
  }

(2)在数据提供者中建立行数组和列数组存储要调用的行和列,并在调用时传入建立的数组,如下所示:

    @DataProvider
    public Object[][] datas(){
        String excelPath="src/test/resources/测试用例_V1.xlsx";
        int rowNum[]= {1,2,3,4,5,6,7};
        int cellNum[]= {5,6};
        Object[][] datas= ExcelUtil_3.getDatas(excelPath,"Sheet1",rowNum,cellNum);
        return datas;
    }  

 

六、总结

1、内容概要

  • 一条数据一个测试方法
  • 使用数据提供者,数组存储测试数据
  • 使用数据提供者,Excel存储数据
  • 读取文件类优化之处理表格中数据行列连续
  • 读取文件类优化之处理表格中数据行列不连续情况

2、各种封装数据比较

  • 一组用例一个测试方法:
  • 利用测试提供者方法:测试数据写在测试代码中,耦合严重
  • EXCEL存储数据:将测试提供者方法中的数据放到表格中再进行读取获取。