http 接口测试 java_接口自动化:HttpClient + TestNG + Java(五) - 接口测试数据驱动-程序员宅基地

技术标签: http 接口测试 java  

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

5.1 测试数据处理思路

5.1.1 测试数据分离

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

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

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

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

8df3b58a7a511c96ef4a9f34232548d6.png

考虑用表单来驱动请求的方法,暂时写上了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,写入以下内容:

packagecom.test.api;importjava.io.FileInputStream;importjava.util.Properties;public classTestAPI {publicProperties prop;publicString excelPath;publicString host;//构造函数

publictestAPI() {try{

//数据流的形式读取配置文件

prop= newProperties();

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类,写入以下代码:

packagecom.test.utils;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importorg.apache.poi.hssf.usermodel.HSSFCell;importorg.apache.poi.hssf.usermodel.HSSFSheet;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.ss.usermodel.CellType;public classExcelProcess {public static Object[][] proessExcel(String filePath,int sheetId) throwsIOException{//数据流读入excel

File file = new File(System.getProperty("user.dir")+filePath);

FileInputStream fis= newFileInputStream(file);

HSSFWorkbook wb= newHSSFWorkbook(fis);//读取特定表单并计算行列数

HSSFSheet sheet =wb.getSheetAt(sheetId);int numberOfRow =sheet.getPhysicalNumberOfRows();int numberOfCell = sheet.getRow(0).getLastCellNum();//将表单数据处理存入dtt对象

Object[][] dttData = newObject[numberOfRow][numberOfCell];for(int i=0;i

}for(int j=0;j

}

HSSFCell cell=sheet.getRow(i).getCell(j);

cell.setCellType(CellType.STRING);

dttData[i][j]=cell.getStringCellValue();

}

}returndttData;

}

}

5.2.3 jsonPath处理反馈信息

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

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

packagecom.test.utils;importcom.alibaba.fastjson.JSONObject;importcom.jayway.jsonpath.JsonPath;importcom.jayway.jsonpath.ReadContext;importnet.minidev.json.JSONArray;public classJSONParser {public booleanisResponseCorrect(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测试类,改写后代码如下:

packagecom.test.api;importorg.testng.annotations.Test;importcom.alibaba.fastjson.JSONObject;importcom.test.client.RestfulClient;importcom.test.utils.ExcelProcess;importcom.test.utils.JSONParser;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importorg.apache.http.NameValuePair;importorg.apache.http.client.ClientProtocolException;importorg.apache.http.message.BasicNameValuePair;importorg.testng.Assert;importorg.testng.annotations.BeforeClass;public class TestPost extendsTestAPI{

RestfulClient client;

JSONObject responseBody;intresponseCode;

String url;

String postBody;

Object[][] excelData;

HashMaphashHead;

@BeforeClasspublic void setup() throwsClientProtocolException, IOException {//读取用例excel

excelData = ExcelProcess.proessExcel(excelPath, 1);//实例化client

client = newRestfulClient();//设置好请求头部

hashHead = new HashMap();

hashHead.put("Content-Type", "application/x-www-form-urlencoded");

}

@Testpublic void testPostRequest() throwsClientProtocolException, IOException {//从第二行开始遍历表单,跳过表头

for(int i=1;i

String address = excelData[i][3].toString();

url= host+address;

String checkPoint= excelData[i][4].toString();

String checkValue= excelData[i][5].toString();//用NameValuePair存储所有请求参数

List keys = new ArrayList();for(int j=7;j

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= newJSONParser();boolean result =jParser.isResponseCorrect(responseBody, checkPoint, checkValue);//断言判断结果

Assert.assertTrue(result);

Assert.assertEquals(responseCode,200);

}

}

}

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

5.3.2 测试结果

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

a60213648d6ea2f327147ec8bd4fde3b.png

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

注:

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42132056/article/details/114456162

智能推荐

专访著名3D动画设计师DAVID LIU _三维动画大神级人物-程序员宅基地

文章浏览阅读7k次。专访著名3D动画设计师DAVID LIU _三维动画大神级人物

基于Qt实现TCP和UDP客户端与服务端的完整指南_qtcp的服务端和客户端的示例程序-程序员宅基地

文章浏览阅读967次,点赞15次,收藏10次。在当今的软件开发领域,网络通信已经成为了不可或缺的一部分。无论是在物联网(IoT)、企业级应用还是简单的客户端与服务端通信场景中,有效且高效的数据传输都是至关重要的。Qt,作为一个跨平台的C++框架,不仅提供了丰富的用户界面组件,还提供了一套完整的网络模块,使得开发者能够轻松地实现TCP和UDP通信。本文将指导你如何使用Qt来创建TCP和UDP的客户端与服务端,并提供相应的代码示例。_qtcp的服务端和客户端的示例程序

word poi 合并单元格(解决出现的合并单元格导致table行总宽度变窄问题)_poi word 表格 合并单元格-程序员宅基地

文章浏览阅读457次,点赞12次,收藏8次。3、当需要复制的区域范围每一列都为几列合并形成的,在word中合并单元格后就会出现word的table总宽度的宽度变窄问题。测试发现table合并单元格后宽度只有合并前第一列的宽度,分析是table合并列宽并没有把宽度相加。1、获取excel中需要复制的表格区域范围的坐标位置,然后在word中创建表格进行复制。2、word 中的table的单元格宽度根据excel中的宽度或者缩放设置。_poi word 表格 合并单元格

关于Nodejs里代理设置的问题-程序员宅基地

文章浏览阅读588次。解决一个历史遗留问题:博客上线后第一篇关于Nodejs的博客就是——Nodejs绑定域名与反向代理;是关于Nodejs的代理设置,到现在为止线上几个二级小站也还是在使用那个http-proxy模块,却怎么也没想到,这些小站的一个共同的遗留问题也源自这个代理模块;问题在于:用已知的各种方式获取到的访问者的ip永远为127.0.0.1;拜托..._nodejs代理请求时透传用户ip

PS网页设计教程XV——如何在Photoshop中创建一个充满活力的作品集的网页设计-程序员宅基地

文章浏览阅读2.7k次。作为编码者,美工基础是偏弱的。我们可以参考一些成熟的网页PS教程,提高自身的设计能力。套用一句话,“熟读唐诗三百首,不会作诗也会吟”。本系列的教程来源于网上的PS教程,都是国外的,全英文的。本人尝试翻译这些优秀的教程。因为翻译能力有限,翻译的细节上还有待推敲,希望广大网友不吝赐教。约定:1、本文的软件是Photoshop CS5版本2、原教程的截图是英文的,本人在重新制作的基础上,..._psxv

Falco安全项目扩展输出与自定义规则_falco 修改rulesfiles-程序员宅基地

文章浏览阅读3.1k次。Falco扩展输出与自定义规则文章目录Falco扩展输出与自定义规则Falco以及Falcosidekick输出类型汇总ChatMetrics / ObservabilityAlertingLogsObject StorageFaaS / ServerlessMessage queue / StreamingEmailWeb部署Falco部署Falcosidekick自定义规则一、规则简介二、Rules规则2.1 Conditions条件2.2 Macros宏2.3 Lists列表三、附加到列表、规则和宏_falco 修改rulesfiles

随便推点

Excel中将所有图片在单元格居中并固定大小_宏将插入的图片在单元格居中-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏7次。Excel中将所有图片在单元格居中并固定大小1.本代码来源于博客内几位大佬代码并结合自己实际应用而成,分享给有相同工作需要的朋友2.效果展示3.宏代码Sub dq()Dim shp As ShapeActiveSheet.Shapes.Range(Array(“Picture 1”)).SelectActiveSheet.Shapes.SelectAllSelection.Shap..._宏将插入的图片在单元格居中

CSS面试题汇总-程序员宅基地

文章浏览阅读319次,点赞4次,收藏5次。自己整理的css面试题,希望可以帮助大家,一起探讨

如何根据某一列数据合并多个excel为-程序员宅基地

文章浏览阅读1k次。一个文件?要根据某一列数据合并多个 Excel 文件为一个文件,你可以使用 Microsoft Excel 的「数据透视表」功能。打开一个空的 Excel 文件,并将所有需要合并的 Excel 文件的数据复制到该文件中。选择数据,然后点击「数据」选项卡中的「数据透视表」命令。在弹出的「数据透视表」对话框中,选择需要合并的列作为「行标签」,然后点击「确定」按钮。Excel 会根据指..._根据某一列合并excel

filebeat安装部署-程序员宅基地

文章浏览阅读204次。简单概述  最近在了解ELK做日志采集相关的内容,这篇文章主要讲解通过filebeat来实现日志的收集。日志采集的工具有很多种,如fluentd, flume, logstash,betas等等。首先要知道为什么要使用filebeat呢?因为logstash是jvm跑的,资源消耗比较大,启动一个logstash就需要消耗500M左右的内存,而filebeat只需要10来M内存资源。常用的ELK..._filebeat的安装与部署

进程管理(十二)--内核线程_没有内核线程会怎么样-程序员宅基地

文章浏览阅读939次。在Linux系统中,前面我们接触了用户进程或用户进程,但是在实际的也是有内核线程的存在,例如我们在内存管理章节中熟悉的内存回收进程kswapd,软中断等。本章主主要包括内核线程的创建和结束的完整过程。1. Linux线程管理Linux内核在启动的时候,是没有线程的概念,当内核初始化完成后将启动一系列的线程,之后,CPU执行流就绑定在一个线程中运行,内核线程和用户线程的区别如下图所示:每一个线程创建之初都是内核线程;创建之后如果与具体的进程上下文绑定,那线程就成了用户线程如果绑定的内核线程,那么执行_没有内核线程会怎么样

中标麒麟linux模拟器,Kydroid安卓运行环境-程序员宅基地

文章浏览阅读2.8k次。银河麒麟Kydroid是一款非常出色的安卓运行环境,能够与大多数APP兼容,你可以用它来玩流行的手机游戏。如果你使用的是银河麒麟系统,它的功能加更加强大,与模拟器和虚拟机有所差别。软件介绍Kydroid是麒麟团队为“银河麒麟操作系统”打造的一款安卓运行环境,用于解决用户的多样化应用需求。Kydroid 能够让用户在银河麒麟操作系统中安装和运行安卓系统的应用程序,如:QQ、微信、股票、音乐、浏览器、..._手机模拟器麒麟系统