在上一篇中,我们实现了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. disk.go

    package disk import "syscall" //空间使用结构体 type DiskStatus struct {     Size uint64     Used ...

  2. Elasticsearch笔记九之优化

    Elasticsearch笔记九之优化 ).get(); } curl命令可以在linux中建立一个定时任务每天执行一次,同样java代码也可以建立一个定时器来执行. 2:内存设置之前介绍过es集群有 ...

  3. 【源码安装】Heartbeat3.0.9

    1.概述1.1 关于Heartbeat1.2 本篇博客实践环境2. 部署基础环境2.1 通过YUM安装依赖环境2.2 创建Heartbeat用户和组3. 编译安装3.1下载源码包3.2 编译安装3.2 ...

  4. 面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数

    前言 楼主今天在面经上看到这个题,挺有意思,小小的题目对多线程的考量还挺多.大部分同学都会使用 synchronized 来实现.楼主今天带来另外两种优化实现,让你面试的时候,傲视群雄! 第一种 sy ...

  5. MYSQL—— 启动MYSQL 57 报错“The service MYSQL57 failed the most recent........等”的问题解决方式!

    每天开机之后,启动MYSQL Notifier就报错,第一次出现重启电脑后解决,后面的几天老是出现,重启电脑好几次都没有解决,感觉很烦人,一定要搞定这个问题找到原因,于是有了下文....... 启动M ...

  6. [Android]自己动手做个拼图游戏

    目标 在做这个游戏之前,我们先定一些小目标列出来,一个一个的解决,这样,一个小游戏就不知不觉的完成啦.我们的目标如下: 游戏全屏,将图片拉伸成屏幕大小,并将其切成若干块. 将拼图块随机打乱,并保证其能 ...

  7. 腾讯云存储专家深度解读基于Ceph对象存储的混合云机制

    背景 毫无疑问,乘着云计算发展的东风,Ceph已经是当今最火热的软件定义存储开源项目.如下图所示,它在同一底层平台之上可以对外提供三种存储接口,分别是文件存储.对象存储以及块存储,本文主要关注的是对象 ...

  8. python接口自动化(十四)--session关联接口(详解)

    简介 上一篇cookie绕过验证码模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等等,这时候如何保持会话呢?这里我以jenkins平台为例,给小伙伴们在沙场演练一下. se ...

  9. flutter初体验

    flutter初体验 和flutter斗争了两个周末,基本弄清楚了这个玩意的布局和一些常用组件了. 在flutter里面,所有东西都是组件Widget.我们像拼接积木一样拼接Widget,拼接的关键词 ...

  10. [数据库锁机制] 深入理解乐观锁、悲观锁以及CAS乐观锁的实现机制原理分析

    前言: 在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念.数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务 ...