在上一篇中,我们实现了post方法请求的封装和测试,这一篇我们做测试数据的分离。

5.1 测试数据处理思路

5.1.1 测试数据分离

这里我想到,我们之前的测试demo里,全都是在testNG类里去写入测试请求的相关数据。

如果测试到达一定规模,这样去维护测试数据会当然是不行的。

比较好的办法应该是将测试数据分离出来,通过外部文件来管理,然后读取文件驱动测试。

这个外部文件用Excel来做会比较合适,设计如下:

考虑用表单来驱动请求的方法,暂时写上了Get,Post,Put和Delete方法。当然其实我还没有去实现put和delete方法,后续再添加。

表单的内容分别记录:

  • 测试用例编号
  • 测试名称
  • 协议
  • 接口地址
  • 检查点
  • 状态码
  • key1...keyN传入参数

之前用到的url这样的不会轻易变动的数据存放到另一个property文件中去。

5.1.2 配置数据分离

接下来将测试中所用到的配置独立出去:

在src/main/resource下新建config.properties文件。

Host = https://api.apishop.net/
testData = \\src\\test\\resources\\APIcase.xls

主要用于存放用到的外部文件位置。

5.2 数据读取和处理

5.2.1 测试基类读取配置

在项目中src/test/java下新建包com.test.api,创建类TestApi.java,写入以下内容:

package com.test.api;

import java.io.FileInputStream;
import java.util.Properties; public class TestAPI {
public Properties prop;
public String excelPath;
public String host; //构造函数
public testAPI() {
try {
       //数据流的形式读取配置文件
prop = new Properties();
FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+
"/src/main/resources/config.properties");
prop.load(fis);
} catch (Exception e) {
e.printStackTrace();
} host = prop.getProperty("Host");
excelPath=prop.getProperty("testData");
}
}

把这个类做为我们测试基类,后续在创建测试时只要继承这个类就可以了。

5.2.2 POI读取外部Excel

在项目中src/main/java下的test.com.utils包中,新建ExcelProcess类,写入以下代码:

package com.test.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType; public class ExcelProcess {public static Object[][] proessExcel(String filePath,int sheetId) throws IOException{ //数据流读入excel
File file = new File(System.getProperty("user.dir")+filePath);
FileInputStream fis = new FileInputStream(file);
HSSFWorkbook wb = new HSSFWorkbook(fis); //读取特定表单并计算行列数
HSSFSheet sheet = wb.getSheetAt(sheetId);
int numberOfRow = sheet.getPhysicalNumberOfRows();
int numberOfCell = sheet.getRow(0).getLastCellNum(); //将表单数据处理存入dtt对象
Object[][] dttData = new Object[numberOfRow][numberOfCell];
for(int i=0;i<numberOfRow;i++){
if(null==sheet.getRow(i)||"".equals(sheet.getRow(i))){
continue;
}
for(int j=0;j<numberOfCell;j++) {
if(null==sheet.getRow(i).getCell(j)||"".equals(sheet.getRow(i).getCell(j))){
continue;
}
HSSFCell cell = sheet.getRow(i).getCell(j);
cell.setCellType(CellType.STRING);
dttData[i][j] = cell.getStringCellValue();
}
}
return dttData;
}
}

5.2.3 jsonPath处理反馈信息

在本篇第一部分的设计中,我将每个测试的验证点写在了外部excel文件里,基本的想法是,从反馈信息内拿出相应的键值,与excel内的验证点相比较。

所以这里我需要改造之前的JSONParser,去实现特定键值对的获取。这里我用jsonPath去实现:

package com.test.utils;

import com.alibaba.fastjson.JSONObject;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.ReadContext; import net.minidev.json.JSONArray; public class JSONParser { public boolean isResponseCorrect(JSONObject jo,String checkpoint,String passValue){
     //用jsonpath处理json,获取result中特定键值
ReadContext context = JsonPath.parse(jo);
JSONArray result = context.read("$.result.."+checkpoint);
String resultString = result.get(0).toString();
if(resultString.equals(passValue)){
return true;
}else{
return false;
}
}
}

jsonpath本文不再赘述,感兴趣的可以去搜索一下相关教程。本段代码也只是简单的用".."去实现对result元素下的所有元素进行遍历和匹配。

5.3 实现测试类

5.3.1 TestNG类实现测试

重写TestPost测试类,改写后代码如下:

package com.test.api;

import org.testng.annotations.Test;

import com.alibaba.fastjson.JSONObject;
import com.test.client.RestfulClient;
import com.test.utils.ExcelProcess;
import com.test.utils.JSONParser; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.message.BasicNameValuePair;
import org.testng.Assert;
import org.testng.annotations.BeforeClass; public class TestPost extends TestAPI{
RestfulClient client;
JSONObject responseBody;
int responseCode;
String url;
String postBody;
Object[][] excelData;
HashMap<String, String> hashHead; @BeforeClass
public void setup() throws ClientProtocolException, IOException {
//读取用例excel
excelData = ExcelProcess.proessExcel(excelPath, 1); //实例化client
client = new RestfulClient(); //设置好请求头部
hashHead = new HashMap<String, String>();
hashHead.put("Content-Type", "application/x-www-form-urlencoded");
} @Test
public void testPostRequest() throws ClientProtocolException, IOException {
//从第二行开始遍历表单,跳过表头
for(int i=1;i<excelData.length;i++){
//从特定位置读取测试数据
String address = excelData[i][3].toString();
url = host+address;
String checkPoint = excelData[i][4].toString();
String checkValue = excelData[i][5].toString();
//用NameValuePair存储所有请求参数
List<NameValuePair> keys = new ArrayList<NameValuePair>();
for(int j=7;j<excelData[i].length-2;j=j+2){
//因为每种请求的参数个数不确定,在这里进行非空判断
if(excelData[i][j]==null){
break;
}
NameValuePair pair = new BasicNameValuePair(excelData[i][j].toString(),excelData[i][j+1].toString());
keys.add(pair);
} //发出请求
client.sendPost(url, keys, hashHead); responseBody = client.getBodyInJSON();
responseCode = client.getCodeInNumber(); JSONParser jParser = new JSONParser();
boolean result = jParser.isResponseCorrect(responseBody, checkPoint, checkValue); //断言判断结果
Assert.assertTrue(result);
Assert.assertEquals(responseCode, 200);
}
}
}

测试类继承前文的TestAPI类,setup方法读取excel表单,设置好请求头部,testPostRequest发送请求并分析结果。

5.3.2 测试结果

用以下外部测试数据驱动测试:

可以看到,测试用例中包含了两个不同的接口测试,测试均通过。

注:

在TestNG测试类里,在读取测试数据时,我采取的是读取固定位置的参数,显然这样的处理在代码健壮性上是比较差的,可以进一步改进。

另外测试数据中的protocol我只是进行了设计,还没有真正处理。

接口自动化:HttpClient + TestNG + Java(五) - 接口测试数据驱动的更多相关文章

  1. 接口自动化:HttpClient + TestNG + Java(一) - 接口测试概述+自动化环境搭建

    1.1 接口测试简介 1.1.1 什么是接口测试 开始学习接口自动化测试之前,我们先要来了解什么是接口,以及什么是接口测试. 我们都知道,测试从级别上划分可以分为 组件测试 集成测试 系统测试 验收测 ...

  2. 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求

    在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...

  3. java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮

    1.简介 上一篇宏哥介绍完了接口用例设计,那么这一章节,宏哥就趁热打铁介绍一下,接口测试工具.然后小伙伴们或者童鞋们就可以用接口测试工具按照设计好的测试用例开始执行用例进行接口手动测试了.关于手动测试 ...

  4. 接口自动化学习--testNG

    一个月一更的节奏~ testNg是一个开源的自动化测试框架..具体那些什么特点的就不想打了- -,贴张图(虽然也看不懂): 学习网站:https://www.yiibai.com/testng 一样是 ...

  5. 基于Python的接口自动化-unittest测试框架和ddt数据驱动

    引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...

  6. 接口自动化:HttpClient + TestNG + Java(四) - 封装和测试post方法请求

    在上一篇中,我们对第一个自动化接口测试用例做了初步优化和断言,这一篇我们处理POST请求. 4.1 发送POST方法请求 post方法和get方法是我们在做接口测试时,绝大部分场景下要应对的主要方法. ...

  7. 接口自动化:HttpClient + TestNG + Java(三) - 初步封装和testng断言

    在上一篇中,我们写了第一个get请求的测试类,这一篇我们来对他进行初步优化和封装 3.1 分离请求发送类 首先想到的问题是,以后我们的接口自动化测试框架会大量用到发送http请求的功能. 那么这一部分 ...

  8. Java接口自动化测试之TestNG测试报告ExtentReports的应用(三)

    pom.xml导入包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  9. Java接口自动化测试之TestNG学习(二)

    在maven项目的pom.xml文件中导入TestNG <?xml version="1.0" encoding="UTF-8"?> <pro ...

随机推荐

  1. logger.go

    package app //日志接口 type Logger interface {     Output(maxdepth int, s string) error }

  2. MFC中ComboBox控件用法

    MFC ComboBox 一.入门篇 ComboBox (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项 ...

  3. 虚拟机console基础环境部署——配置本地YUM源

    1. CD/ROM装载系统镜像2. 挂载设备3. 配置本地源4. 总结 有关YUM源及Linux系统三大软件管理方式,参照博客<CentOS系统三大软件管理>,笔记内链:CentOS系统三 ...

  4. 了解Scala 宏

    前情回顾 了解Scala反射介绍了反射的基本概念以及运行时反射的用法, 同时简单的介绍了一下编译原理知识, 其中我感觉最为绕的地方, 就属泛型的几种使用方式了. 而最抽象的概念, 就是对于符号和抽象树 ...

  5. 使用Scala IDE for Eclipse遇到build errors错误的解决办法

    在编写第一个Scala语言的Spark程序时,在Scala IDE for Eclipse中运行程序时出现“Project XXXX contains build errors, Continue l ...

  6. 将本地文件传输到GitHub

    统一概念: 工作区:增删文件和内容 暂存区:键入命令 git add 改动的文件,此次改动就放到了 『暂存区』 本地仓库 :键入命令 git commit ,此次改动就放到了『本地仓库』,每个 com ...

  7. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...

  8. [区块链] 拜占庭将军问题 [BFT]

    背景: 拜占庭将军问题很多人可能听过,但不知道具体是什么意思.那么究竟什么是拜占庭将军问题呢? 本文从最通俗的故事讲起,并对该问题进行抽象,并告诉大家拜占庭将军问题为什么在区块链领域作为一个重点研究问 ...

  9. 开箱即用Bumblebee独立部署搭建webapi网关详解

    在之前的章节里都是讲述如何在程序中使用Bumblebee来构建一个Webapi网关:但这样显然有些麻烦,毕竟很多时候可能只需要一个简单负载处理,还需要写个程序针对服务进行编写代码或配置的确是比较麻烦的 ...

  10. .net double类型转string类型的坑

    之前项目当中的接入的高德逆地理编码功能偶尔会出现参数错误的bug,经过排查服务端异常log,发现请求的url中的location参数中的小数点变成了逗号. 代码如下 public async Task ...