接口测试,可以提前发现问题,保证项目质量
接口测试和UI测试边界
接口:搜索正确性与相关性
UI:交互流程、数据展示
接口本身就适合自动化属性,就不用使用postman,直接使用测试框架就可以
RobotFramework 是基于关键字封装,重构难,维护成本大,而且接触不到代码,能力没法成长
推荐框架:
Python:Requests、HttpRunner
Java:RestAssured
Requests框架
功能全面:支持 http/https
使用简单:简单易用,不用关系底层细节
定制性高:借助于hook机制 完成通用处理?
(小公司一般用jmeter进行接口测试,不能持续集成,大公司不用;jmeter是个性能测试工具,只是可以测试接口)
request官网:https://requests.readthedocs.io/en/master/
Requests举例
from pprint import pprint import requests def test_requests(): # 发起请求,get方法可以追加参数 r = requests.get("https://ceshiren.com/") pprint(r) print(r.request) print(r.status_code) # 断言 assert r.status_code == 200
get请求
post请求
post也可以传 params
文件上传
请求传cookie
相应结果断言
基本信息:
r.url r.status_code r.headers r.cookies
相应结果
r.text = r.encoding + e.content
r.json() = r.encoding + r.content + content type json
r.raw.read(10)
对应的请求内容:
r.request
举例
r.json
(第二个箭头指的,因为参数会符合http规范,首字母大写,所以要去找“Header”,而不是“header”)
断言
json.dumps()用于将字典形式的数据转化为字符串,json.loads()用于将字符串形式的数据转化为字典
循环查找式断言
jsonpath断言
xml断言、xpath断言
hamcrest断言:
解决复杂断言情况,比如 结果接近10的话 就判断通过,这样的情景使用assert是没法实现的
json schema断言:
Json Schema定义了一套词汇和规则,这套词汇和规则用来定义Json元数据,且元数据也是通过Json数据形式表达的。Json元数据定义了Json数据需要满足的规范,规范包括成员、结构、类型、约束等。
teardown和setup方法,尽量用setup
teardown风险:如果用例中途被kill掉,那么teardown是不会被执行的
接口的数据驱动
1、直接传递参数
@pytest.mark.parametrize传递参数
@pytest.mark.parametrize("name", [ "demo1", "中文", "中文_1", "123", "aasd", "*", " ", "😨" ]) def test_delete(self, name): # name = "demo_4" # 如果有就删除 r = self.tag.get() x = self.tag.jsonpath(f"$..tag[?(@.name=='{name}')]") if isinstance(x, list) and len(x) > 0: self.tag.delete(tag_id=[x[0]['id']]) # 环境干净后开始测试 r = self.tag.get() path = "$..tag[?(@.name!='')]" size = len(self.tag.jsonpath(path)) # 添加新标签 self.tag.add(name) r = self.tag.get() assert len(self.tag.jsonpath(path)) == size + 1 tag_id = self.tag.jsonpath(f"$..tag[?(@.name=='{name}')]")[0]['id'] print(tag_id + '-----') self.tag.delete(tag_id=[tag_id]) # assert len(self.tag.jsonpath(path)) == size
2、通过yaml文件
yaml文件:
"test_delete": ["demo1", "中文", "中文_1", "123", "aasd", "*", " ", "😨"]testcase
BaseApi:
BaseApi中: # 封装yaml文件的加载 @classmethod def yaml_load(self, path) -> list: with open(path) as f: return yaml.safe_load(f)
testcase:
data = BaseApi.yaml_load("test_tag.data.yaml")
@pytest.mark.parametrize("name", data["test_delete"]) def test_delete(self, name): # name = "demo_4" # 如果有就删除 r = self.tag.get() x = self.tag.jsonpath(f"$..tag[?(@.name=='{name}')]") if isinstance(x, list) and len(x) > 0: self.tag.delete(tag_id=[x[0]['id']]) # 环境干净后开始测试 r = self.tag.get() path = "$..tag[?(@.name!='')]" size = len(self.tag.jsonpath(path)) # 添加新标签 self.tag.add(name) r = self.tag.get() assert len(self.tag.jsonpath(path)) == size + 1 tag_id = self.tag.jsonpath(f"$..tag[?(@.name=='{name}')]")[0]['id'] print(tag_id + '-----') self.tag.delete(tag_id=[tag_id]) # assert len(self.tag.jsonpath(path)) == size
hook机制
对拿到的response加一些类型,从而得到新的字段,常用于 加密&解密
举例
jsonpath
【接口测试--坑】
1、执行代码报错:SSLError
原因:url为https,charles证书问题,把SSL Proxying 关掉即可