做接口测试需要对每个接口进行断言,如果没有添加断言,使用pytest 执行的时候,默认都是通过的状态。
需要对接口进行断言。
断言使用 python中自带的 assert 即可。
基本断言
注册接口,注册成功。
- 针对服务器返回的状态码进行断言。 200
- 服务器返回结果中的主要字段进行断言
```python
import requests
import random
随机生成手机号码
phone = random.randint(13000000000,13999999999)
def test_register():
# 定义注册用户的地址
url = "http://49.233.108.117:28019/api/v1/user/register"
# 定义请求数据
bodydata = {
"loginName": str(phone),
"password": "123456"
}
print(bodydata)
# 发送请求 url= 表示请求地址, json= 请求数据为json格式
r = requests.post(url=url, json=bodydata)
# r 是整个服务器返回的结果
print("状态码:", r.status_code)
# 服务器返回结果
print("结果:", r.json())
# 服务器返回状态码为 200
assert r.status_code == 200
# 服务器返回结果断言 针对字典断言
assert r.json() == {'resultCode': 200, 'message': 'SUCCESS', 'data': None}
当断言结果失败的时候,pytest会自动将此用例标记为失败。<br />
<a name="cRerp"></a>
# 复杂数据类型断言
<a name="K02Il"></a>
## 有不确定字段的时候
当登录接口成功,返回的结果有token 值,每次token 值都不一样,没有办法确定断言。但是可以确定这个不为None
<a name="MveSd"></a>
### 为空判断 is None
```python
def test_login():
a = None
assert a is None
不为空判断 is not None
def test_login():
a = 10
assert a is not None
对登录接口进行判断
import requests
import random
# 随机生成手机号码
phone = random.randint(13000000000,13999999999)
def test_register():
# 定义注册用户的地址
url = "http://49.233.108.117:28019/api/v1/user/register"
# 定义请求数据
bodydata = {
"loginName": str(phone),
"password": "123456"
}
print(bodydata)
# 发送请求 url= 表示请求地址, json= 请求数据为json格式
r = requests.post(url=url, json=bodydata)
# r 是整个服务器返回的结果
print("状态码:", r.status_code)
# 服务器返回结果
print("结果:", r.json())
# 服务器返回状态码为 200
assert r.status_code == 200
# 服务器返回结果断言 针对字典断言
assert r.json() == {'resultCode': 200, 'message': 'SUCCESS', 'data': None}
def test_login():
url = "http://49.233.108.117:28019/api/v1/user/login"
bodydata = {
"loginName": str(phone),
"passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"
}
print(bodydata)
r = requests.post(url, json=bodydata)
print(r.status_code)
print(r.json())
# 针对主要的data字段进行断言
assert r.json()["data"] is not None
assert r.json()["resultCode"] == 200
assert r.json()["message"] == "SUCCESS"
结果数据有很多时
import requests
import random
def test_topics():
l = "http://47.100.175.62:3000/api/v1/topics"
# 请求参数
q = {
"tab":"ask",
"limit":15
}
#发送get 请求 params= 请求参数
r = requests.get(url=l,params=q)
print(r.json())
# 添加断言,limit 设置为10, 返回结果中有10条数据
assert len(r.json()["data"]) == q["limit"]
# 添加断言 tab 为 ask, 返回结果所有的话题的tab值都是 ask
# 使用循环 遍历每一个话题,
for tp in r.json()["data"]:
# 每个话题的tab值跟上面 查询条件中的 tab 值保持一致。
assert tp["tab"] == q["tab"]
通过使用for 循环 循环遍历每个结果,对结果中的数据进行断言。
总结
在添加断言的时候,能够确定的部分 直接使用断言即可。
有些数据比较多,不能针对每个数据都进行测试,那就将主要的字段进行断言。
有上下游关联的断言。
针对单个接口添加断言,不太容易,但是可以通过借助另外一个接口结果来进行断言。
import requests
jsondata = {
"topicid":None
}
testdata = {
"title":"helloworld",
"tab":"ask",
"content":"xxxxxxxxxx"
}
def test_create_topic():
url = "http://47.100.175.62:3000/api/v1/topics"
bodydata= {
"accesstoken":"6771e6c8-b681-4bd4-ae10-831b99fc6be7",
"title":testdata["title"], # 使用预定的数据
"tab":testdata["tab"],
"content":testdata['content']
}
r = requests.post(url=url,json=bodydata)
print(r.json())
# 设置上游参数
jsondata["topicid"] = r.json()["topic_id"]
def test_topic_detail():
url = f"http://47.100.175.62:3000/api/v1/topic/{jsondata['topicid']}"
q = {
"mdrender": "false"
}
r = requests.get(url,params=q)
print(r.json())
# 添加断言,返回结果中的 id 跟上一个接口发帖成功返回的id一样
assert r.json()["data"]["id"] == jsondata["topicid"]
# 针对发帖的内容添加断言 使用预定的数据
assert r.json()['data']['tab'] == testdata['tab']
assert r.json()['data']['title'] == testdata["title"]
assert r.json()['data']['content'] == testdata["content"]
将测试数据放在函数外面,
第一用例创建话题的时候使用 预定义的数据
第二用例查看详情 添加断言 从返回结果中拿到对应的数据 跟上面发帖使用的数据进行对比。
面试扩展
怎么添加断言
你认为你做的接口中比较复杂的断言游哪些?
电商系统, 添加购物车 并下订单, 订单支付成功之后, 查看订单详情,订单详情中的商品数据一定下订单的商品,下订单的时候用的是商品的id, 支付成功之后通过查看订单详情可以看到商品的id。利用订单详情的接口来判断下订单接口中的商品。