做接口测试需要对每个接口进行断言,如果没有添加断言,使用pytest 执行的时候,默认都是通过的状态。
需要对接口进行断言。
断言使用 python中自带的 assert 即可。

基本断言

注册接口,注册成功。

  1. 针对服务器返回的状态码进行断言。 200
  2. 服务器返回结果中的主要字段进行断言 ```python import requests import random

    随机生成手机号码

    phone = random.randint(13000000000,13999999999)

def test_register():

  1. # 定义注册用户的地址
  2. url = "http://49.233.108.117:28019/api/v1/user/register"
  3. # 定义请求数据
  4. bodydata = {
  5. "loginName": str(phone),
  6. "password": "123456"
  7. }
  8. print(bodydata)
  9. # 发送请求 url= 表示请求地址, json= 请求数据为json格式
  10. r = requests.post(url=url, json=bodydata)
  11. # r 是整个服务器返回的结果
  12. print("状态码:", r.status_code)
  13. # 服务器返回结果
  14. print("结果:", r.json())
  15. # 服务器返回状态码为 200
  16. assert r.status_code == 200
  17. # 服务器返回结果断言 针对字典断言
  18. assert r.json() == {'resultCode': 200, 'message': 'SUCCESS', 'data': None}
当断言结果失败的时候,pytest会自动将此用例标记为失败。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/87080/1654064508572-038592d3-c562-415d-8a0e-1c282bc40ff1.png#clientId=u116793e8-b469-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=675&id=u849f1afe&margin=%5Bobject%20Object%5D&name=image.png&originHeight=844&originWidth=1457&originalType=binary&ratio=1&rotation=0&showTitle=false&size=156944&status=done&style=none&taskId=u0ebcec58-bf33-492f-998f-467733667e5&title=&width=1165.6)

<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 循环 循环遍历每个结果,对结果中的数据进行断言。

总结

在添加断言的时候,能够确定的部分 直接使用断言即可。
有些数据比较多,不能针对每个数据都进行测试,那就将主要的字段进行断言。

有上下游关联的断言。

针对单个接口添加断言,不太容易,但是可以通过借助另外一个接口结果来进行断言。
添加断言 - 图1

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"]

将测试数据放在函数外面,
第一用例创建话题的时候使用 预定义的数据
第二用例查看详情 添加断言 从返回结果中拿到对应的数据 跟上面发帖使用的数据进行对比。

面试扩展

  1. 怎么添加断言

  2. 你认为你做的接口中比较复杂的断言游哪些?

电商系统, 添加购物车 并下订单, 订单支付成功之后, 查看订单详情,订单详情中的商品数据一定下订单的商品,下订单的时候用的是商品的id, 支付成功之后通过查看订单详情可以看到商品的id。利用订单详情的接口来判断下订单接口中的商品。