相信现在很多的公司自动化测试重点都在接口层,因为接口测试更加接近代码底层,相对于UI自动化,接口自动化有着开发更快、覆盖更全、回报率高等优点。

接口自动化代码实现不难,本质上就是代码模拟发送请求,然后判断返回结果是否符合预期即可。目前也有很多成熟开源的可以发送http请求的库,比如python的requests库。requests库易上手,使用起来也非常便捷。比如,我们要测试一个查询用户名的接口。

import pytest
import requests def test_user_info():
'''查询用户信息'''
r = requests.get(url, headers=HEADER)
result = r.json()
assert result["status"] == 0
assert result["data"]["username"] == "把苹果咬哭"

这样就实现了一个接口的测试,用python(语言)+requests(第三方库)+pytest(测试框架)来搭建一套接口自动化项目其实还是很便捷的。

用java造一个“requests”出来

但是对于想使用java语言来搭建的话,暂时就没有像Python的requests这么便捷的库了。java中也有一些可以模拟发送请求的库,比如httpclient、okhttp等。不过这两个用起来的便捷程度跟requests就差远了。不过我们可以去封装出一个类似于requests使用方式的类,组里大佬提供了主要封装,我也根据自己项目需求进行补充,这里分享一下。

在java里实现需要借助另一个核心类,那就是RestTemplate,是Spring提供的用于访问Rest服务的客户端。具体有兴趣的小伙伴可以自行搜索进行更全面的学习。下面就来demo出一个可以模仿requests发送带请求body的post请求,还要带上header。

首先,我们用requests的时候,通常是这样实现的:

import pytest
import requests header = {
'Authorization':"我是鉴权"
} event = {
"id": 1,
"create_user": "把苹果咬哭"
} def test_event_add():
'''测试添加项目'''
r = requests.post(url, data=event, headers=header)
result = r.json() assert result["status"] == 0

所以,我们可以知道关键就在于requests.post(url, data=event, headers=header),传入测试接口url,请求body参数,还有header之后发送请求,这样的调用方式。其实只需要将restTempate简单的封装一下即可。

import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSONObject; public class DemoRestUtils {
RestTemplate restTemplate;
//提供一个默认构造方法
public RestSuperUtils() {
restTemplate = new RestTemplate();
}
/**
* POST Body请求方式,带有header 请求Body JSON Body体
*
* @param url
* @param headers
* @param jsonBody
* @return
*/
public JSONObject postForBody(String url, HttpHeaders headers, JSONObject jsonBody) { HttpEntity<?> httpEntity = new HttpEntity<>(jsonBody, headers);
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity,
JSONObject.class);
JSONObject jsonResponse = responseEntity.getBody();
return jsonResponse;
}
}

这里可以将header跟请求body整合成HttpEntity,这样的话就可以直接调用restTemplate提供的exchange方法,传入接口地址,请求方式,还有请求实体即可完成调用,而且还可以通过ResponseEntity的getBody方法获得返回,再加一卜转化后,返回json格式的请求响应即可。这样我们的用例可以这样写了:

@SpringBootTest
public class TestDemo {
public DemoRestUtils requests;
private final String apiPath = "/addEvent"; void testQueryDemo() {
String reqData = "{\"id\": 1}";
//调用接口
JSONObject reqData = JSON.parseObject(testEvent);
JSONObject response = requests.postForBody(apiPath, reqData);
}
}

最后可以对返回的response做分析,拿到你想要断言的字段,可以使用fastjson的JSONPath.eval方法,可以支持xpath定位到你要的字段,拿到值。

上述只是伪代码,导入依赖如果你使用jetbrain IDea的话会有提示导入,本文目的只是介绍一种思路,并不适合直接复制引用。欢迎交流!

想在java接口自动化里用上Python的requests?这样做就可以了的更多相关文章

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

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

  2. java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)

    简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...

  3. 【转】JAVA接口自动化测试之一个测试方法对应多条测试数据的实现方式

    一.痛点:一条测试数据对应一个测试方法 前面的章节中我们已经写代码实现了登录接口的处理调用,但是一个接口往往是需要多条测试用例才能完整的覆盖到每一种情况. 针对于单接口多条测试用例需要执行的情况,该如 ...

  4. python接口自动化18-multipart/form-data上传多个附件

    前言 reuqests上传一张图片到服务器,前面已经介绍过了,那么如何在提交BUG的时候,上传附件呢? 上传附件的时候,文件的name参数名称是一样的,python里面key是不可以重复的,又如何处理 ...

  5. python接口自动化 - 断言(上)

    我们在做接口自动化的时候会用当unittest框架,这个框架中是有assert方法 当我们写好我们的case后 总要有个验证是否正确的东西,assert就给我们提供了非常强大的结果验证 序号 断言方法 ...

  6. 【亲测】Java 接口自动化步骤

    GET请求(Maven) 一. src/main/java 1.[地址--HOST]创建并设置配置文件(后缀名.properties的文本文件):存放接口请求的host地址 2.[地址]TestBas ...

  7. java接口自动化(二) - 接口测试的用例设计

    1.简介 在这篇文章里,我们来学习一下接口测试用例设计,主要是来学习一些用例设计要点.其实说白了,接口用例设计和功能用例设计差不多,照猫画虎即可.不要把它想象的多么高大上,多么的难,其实一样,以前怎么 ...

  8. java接口自动化基础知识(二)

    二.HttpClient+testNG实现对接口的测试及校验 在上面第一篇中已经实现了基础配置和测试用例数据准备,本篇文章将以登录举例进行测试执行. 这是之前login接口的代码 @Test(grou ...

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

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

随机推荐

  1. 永久修改Ubuntu的主机名称

    Ubuntu主机名称查看方法,使用hostname命令: [ubuntu@ubuntu ~]$hostname ubuntu 永久修改方法: 修改配置文件: sudo vi /etc/hostname ...

  2. Ubuntu16.04忘记用户登录密码以及管理员密码,重置密码的解决方案

    1. 问题现象: 密码遗忘 2. 问题原因 问题原因,搞不懂,只是修改了/etc/shadow和/etc/sudoers这俩文件 3. 解决方案 在系统开机前常按shift键进入grub界面,如下: ...

  3. 「查缺补漏」巩固你的Redis知识体系

    Windows Redis 安装 链接: https://pan.baidu.com/s/1MJnzX_qRuNXJI09euzkPGA 提取码: 2c6w 复制这段内容后打开百度网盘手机App,操作 ...

  4. java标识符、关键字、基本数据类型

    一 标识符与关键字 1.标识符 在程序中用于定义名称的都为标识符,如文件名称.类名称.方法名称或变量名称等, 在Java中标识符的定义格式由字母.数字._(下划线),$所组成,不能以数字开头, 不能是 ...

  5. Css 设置超过再两行显示省略号

    大部分场景都是超过一行就显示... <template> <div class="other-product-item item-name" :title=&qu ...

  6. win10 安装msys2 和 ruby

    1.选择自己的版本 https://rubyinstaller.org/downloads/ Ruby+Devkit 2.5.1-2 (x64) Ruby+Devkit 2.5.1-2 (x86) 2 ...

  7. python设计模式之模板模式

    python设计模式之模板模式 编写优秀代码的一个要素是避免冗余.在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具. 现实中,我们没法始终写出100%通用的代码.许多算法都有一些(但并 ...

  8. JS的赋值与深浅拷贝实例

    赋值 基本类型: 传值,在栈内存中的数据发生数据变化的时候,系统会自动为新的变量分配一个新的之值在栈内存中,两个变量相互独立,互不影响的 引用类型: 传址,只改变指针的指向,指向同一个对象,两个变量相 ...

  9. Salesforce学习笔记之Actions and Recommendations(续)

    上次对这个Actions and Recommendations进行了初步研究,因为一些问题没有得到很好的解决,又花了很多时间,终于得到了一个比较好的解决方案.小结一下. 1. 生成Actions a ...

  10. linux修改最大的文件描述符(max file descriptors)

    用xshell登录linux系统之后,用命令>ulimit -a 注意到系统模式是1024个 使用>ulimit -n 数量,可临时更改,生效范围为当前会话 永久修改的方法: > v ...