接口自动化:HttpClient + TestNG + Java(五) - 接口测试数据驱动
在上一篇中,我们实现了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(五) - 接口测试数据驱动的更多相关文章
- 接口自动化:HttpClient + TestNG + Java(一) - 接口测试概述+自动化环境搭建
1.1 接口测试简介 1.1.1 什么是接口测试 开始学习接口自动化测试之前,我们先要来了解什么是接口,以及什么是接口测试. 我们都知道,测试从级别上划分可以分为 组件测试 集成测试 系统测试 验收测 ...
- 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求
在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...
- java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮
1.简介 上一篇宏哥介绍完了接口用例设计,那么这一章节,宏哥就趁热打铁介绍一下,接口测试工具.然后小伙伴们或者童鞋们就可以用接口测试工具按照设计好的测试用例开始执行用例进行接口手动测试了.关于手动测试 ...
- 接口自动化学习--testNG
一个月一更的节奏~ testNg是一个开源的自动化测试框架..具体那些什么特点的就不想打了- -,贴张图(虽然也看不懂): 学习网站:https://www.yiibai.com/testng 一样是 ...
- 基于Python的接口自动化-unittest测试框架和ddt数据驱动
引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...
- 接口自动化:HttpClient + TestNG + Java(四) - 封装和测试post方法请求
在上一篇中,我们对第一个自动化接口测试用例做了初步优化和断言,这一篇我们处理POST请求. 4.1 发送POST方法请求 post方法和get方法是我们在做接口测试时,绝大部分场景下要应对的主要方法. ...
- 接口自动化:HttpClient + TestNG + Java(三) - 初步封装和testng断言
在上一篇中,我们写了第一个get请求的测试类,这一篇我们来对他进行初步优化和封装 3.1 分离请求发送类 首先想到的问题是,以后我们的接口自动化测试框架会大量用到发送http请求的功能. 那么这一部分 ...
- Java接口自动化测试之TestNG测试报告ExtentReports的应用(三)
pom.xml导入包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
- Java接口自动化测试之TestNG学习(二)
在maven项目的pom.xml文件中导入TestNG <?xml version="1.0" encoding="UTF-8"?> <pro ...
随机推荐
- backend_queue.go
package nsqd // BackendQueue represents the behavior for the secondary message // storage system typ ...
- [HAOI2008]移动玩具 状压
发现自己只会打状压了. 233333 不需要考虑是否会被挡,所以直接dp #include<cstdio> #include<cstring> #include<iost ...
- Python Django 2.2登录功能_2
#Now 让我们继续对上篇的登录进行操作 #对于csrf,以后再开篇章记录 #修改index.html <form method="post" action="/l ...
- gitlab-ci-runner安装
前言 什么是CI/CD? CI (Continuous Integration) 持续集成, CD (Continuous Delivery) 持续部署 个人理解 本地开发代码, 提交远程仓库 仓库接 ...
- poj3352添加多少条边可成为双向连通图
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13311 Accepted: 671 ...
- 【爆料】-《南昆士兰大学毕业证书》USQ一模一样原件
☞南昆士兰大学毕业证书[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归 ...
- 学习React Native必看的几个开源项目
学习React native ,分享几个不错的开源项目,相信你学完之后,一定会有所收获.如果还没有了解RN的同学们可以参考手把手教你React Native 实战之开山篇<一> 1.Fac ...
- Spark学习之数据读取与保存总结(一)
一.动机 我们已经学了很多在 Spark 中对已分发的数据执行的操作.到目前为止,所展示的示例都是从本地集合或者普通文件中进行数据读取和保存的.但有时候,数据量可能大到无法放在一台机器中,这时就需要探 ...
- Linux上删除大量文件几种方式对比
目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...
- 解决tomcat部署项目中碰到的几个问题
在tomcat上部署项目并进行测试,经常会碰到各种问题.在不同的操作系统上部署,对问题的解决也会有一些差异. 1 发现问题 1.1 项目部署 先将项目达成war包,放到tomcat的webapps目录 ...