API自动化-碰到的坑

网络图片

今天写了个API自动化的代码,然后碰到了一堆坑,只怪自己没有理解清楚,所以搞了大半天才完全解决。。不过代码量是不是略大啊 o_O

很早就实现了单个接口的自动化测试,但是我们不可能每个接口都写一遍代码,所以必须整合在一起,解放劳动力

首先,我们的目标是“没有蛀牙”。噗,被广告荼毒了。回归正题,我们想实现一套流程:从excel读取各个数据(包括请求方法-get/post,路径,参数,校验的参数,校验的值);然后自动测试该条记录;然后生成报告

声明ApiCell类(把需要用到的各个参数声明出来)

public classApiCell {

privateStringmethod;

privateStringpath;

privateStringpara;

privateStringass;

privateStringassVal;

publicStringgetMethod() {

returnmethod;

}

public voidsetMethod(String method) {

this.method= method;

}

publicStringgetPath() {

returnpath;

}

public voidsetPath(String path) {

this.path= path;

}

publicStringgetPara() {

returnpara;

}

public voidsetPara(String para) {

this.para= para;

}

publicStringgetAss() {

returnass;

}

public voidsetAss(String ass) {

this.ass= ass;

}

publicStringgetAssVal() {

returnassVal;

}

public voidsetAssVal(String assVal) {

this.assVal= assVal;

}

}

通过poi读取xls格式的excel文件

/**

*读取给定路径的excel文件

*@paramfilePath

*@return

*/

public staticListreadExcel(String filePath) {

//创建workbook

File file =newFile(filePath);

try{

workbook=newHSSFWorkbook(newFileInputStream(file));

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

List> result=newArrayList>();

//声明Api格式。ApiCell是声明的一个类,用来存放excel中需要用到的各个参数

List list=newArrayList();

//遍历excel表格中各个Sheet

for(intnumSheet=0;numSheet

HSSFSheet hssfSheet=workbook.getSheetAt(numSheet);

if(hssfSheet==null){

continue;

}

ApiCell apiCell=null;

//遍历每个Sheet下的各个数据

for(introwNum=1;rowNum<=hssfSheet.getLastRowNum();rowNum++){

//获取每一行数据

HSSFRow hssfRow=hssfSheet.getRow(rowNum);

//如果该行不为空,获取该行下的各个单元格

if(hssfRow !=null) {

apiCell=newApiCell();

//根据excel表格中每列对应的数据保存到相应的变量中

HSSFCell method=hssfRow.getCell(0);

HSSFCell path=hssfRow.getCell(1);

HSSFCell para=hssfRow.getCell(2);

HSSFCell ass=hssfRow.getCell(3);

HSSFCell assVal=hssfRow.getCell(4);

//                    System.out.println("ExcelUtil:"+method+":"+path+":"+para+":"+ass+":"+assVal);

apiCell.setMethod(getValue(method));

apiCell.setPath(getValue(path));

apiCell.setPara(getValue(para));

apiCell.setAss(getValue(ass));

apiCell.setAssVal(getValue(assVal));

list.add(apiCell);

}

}

}

returnlist;

}

读取Excel表格中各个单元格数据

/**

*根据类型读取excel中数据

*@paramhssfCell

*@return

*/

@SuppressWarnings("static-access")

private staticStringgetValue(HSSFCell hssfCell) {

//必须判断excel中的数据是否为空数据,不然会报空指针

if(hssfCell!=null&&(hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN)) {

returnString.valueOf(hssfCell.getBooleanCellValue());

}else if(hssfCell!=null&&(hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC)) {

returnString.valueOf((int)hssfCell.getNumericCellValue());//poi读取数值时默认为double型,必须强制转换为int型

}else if(hssfCell!=null&&(hssfCell.getCellType()==hssfCell.CELL_TYPE_STRING)){

returnString.valueOf(hssfCell.getStringCellValue());

}else{

returnEMPTY;

}

}

从excel读取数据,参数为String类型,但是我们接口写的是Map类型,要转换一下

/**

*把String类型转为map类型

*/

public classString2Map {

public staticMapstringMap(String para){

Map parameter=newHashMap();

JSONObject jsonObject= JSONObject.fromObject(para);

parameter=(Map)jsonObject;

returnparameter;

}

}

好了,可以写测试代码了。。看到这么长的代码,也是怕怕的o_O

public classTestReadExcel {

@Test

public voiddataFromExcelApi()  {

String pathFile="C:\\Users\\Administrator\\Desktop\\api.xls";

List re=ExcelUtil.readExcel(pathFile);

if(re !=null){

for(ApiCell cell : re){

String method = cell.getMethod();

String path = cell.getPath();

String para = cell.getPara();

String ass = cell.getAss();

String assVal = cell.getAssVal();

//                System.out.println("00000000"+method+":"+path+":"+para+":"+ass+":"+assVal);

if(method.equalsIgnoreCase("get") && para ==""){

Response response = ApiUntils.get(path);

String actual = JsonUtils.json(response,ass);

Assert.assertEquals(actual,assVal);

}else if(method.equalsIgnoreCase("get") && para !=""){

Document doc = JsoupApiUtils.getByParameter(path,String2Map.stringMap(para));

Elements elements = doc.select(ass);

String actual = elements.get(0).text();

Assert.assertEquals(actual,assVal);

}else if(method.equalsIgnoreCase("post") && para !=null){

String contentType ="application/x-www-form-urlencoded";

Response response = ApiUntils.postByParameter(path,contentType,String2Map.stringMap(para));

String json = response.asString();

String json01 = json.substring(15,json.length() -15);

JsonPath jp =newJsonPath(json01);

String actual = jp.get(ass).toString();

Assert.assertEquals(actual,assVal);

}

}

}

}

}

还需要自己写不同类型的接口实现方式。我同时用了rest-assured和jsoup两种(有的接口返回的是html代码,所以用到jsoup)。这里不贴代码啦。

好了。。跑吧。。试跑了三个接口,耗时5.7s,速度有提升,再加点数据进去试试。


给自己做个笔记

1.读excel单元格数据的时候,必须判断单元格是否为空,为空会报空指针的错误。自己没有理解这个问题,有条记录是有个单元格为空的,没有加判断,一运行就报空指针,但是自己不明白为啥会报空指针,后面搞清楚了,加了判断就通过了

2.poi读取数值会返回为double类型,必须强制转换为int型。不然通过这个点进行校验就通不过了

3.maven引用jar包时,如果在pom文件中不报错,但是在Dependencies中报错的话,应该是文件下载不完全导致的。我是在导入json-lib包的时候出现问题。解决办法:本地C:\Users\Administrator\.m2\repository\net\sf\json-lib\json-lib中相应版本中,查看jar包是否下载了,如果没有的话,在pom文件中加入<classifier>jdk15</classifier>即可,原因是 json-lib是需要区分jdk版本的。

pom
Dependencies

报告,用的是testng的格式。运行结束后把报告导出,打开是这个样子的。。蛮好看的有木有啊^_^

testng报告

大概就是这样子了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,597评论 18 139
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,723评论 0 33
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,372评论 0 23
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 一直喜欢鲁迅先生《热风》里的一段话: “愿中国青年都摆脱冷气,只是向上走,不必听自暴自弃者流的话。能做事的做事,能...
    Mtoo拂浅阅读 365评论 0 3