接口测试,可以提前发现问题,保证项目质量
接口测试和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 关掉即可
posted on
浙公网安备 33010602011771号