接口测试响应断言

本文探讨了接口测试中对响应数据进行断言的各种方法,包括requests库的json断言、jsonpath用于复杂json数据提取、requests_xml库处理xml数据、以及python和pytest自带及Hamcrest的断言体系。同时介绍了schema断言,用于验证json数据是否符合预设的schema。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当请求一个接口,返回数据后,返回的数据由xml格式、json格式,那么怎么根据返回的结构化数据进行断言,判断返回信息是否正确,接口响应是否正确?

断言数据获取方式:

1、requests自身提供了json断言功能

    def test_json_assrt(self):
        payload = {'key1': 'value1', 'key2': 2}
        r = requests.post('https://httpbin.testing-studio.com/post', json=payload)
        print(r.json())
        assert r.status_code == 200
        assert r.json()['json']['key2'] == 2

 这个接口返回的数据比较简单,因此assert r.json()['json']['key2'] == 2这行代码看起来还算简洁,接下来看一个复杂的json数据结构:https://ceshiren.com/categories.json

此时如果仍然是使用requests自带的json提取器,那么代码将会写的很长,此时可以采用json path来简化提取所需数据

2、json的查询语言jsonpath提取json数据

requests没有提供json path的解决方案,需要安装第三方库

https://www.cnblogs.com/pywen/p/14245876.html

比如原始的json断言需要这么写:

r.json()['category_list']['categories'][0]['name'] == '开源项目'

那么使用jsonpath后可以写成:

jsonpath(r.json(), '$..name')[0]
from jsonpath import jsonpath

    
def test_json_assert1(self):
    r = requests.get('https://ceshiren.com/categories.json')
    assert r.json()['category_list']['categories'][0]['name'] == '开源项目'
    print(jsonpath(r.json(), '$..name')[0])
    assert jsonpath(r.json(), '$..name')[0] == '开源项目'

3、xml相关断言数据提取

requests对xml一直支持的都不强,因此有人写了其他库requests_xml来进行支持

使用前先安装requests_xml库

    def test_xml_assert(self):
        from requests_xml import XMLSession
        session = XMLSession()
        r = session.get('https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss')
        print(r.xml.links)
        item = r.xml.xpath('//item', first=True)
        print(item.text)

requests-xml的官网介绍:

https://pypi.org/project/requests-xml/

除了能够通过xpath提取xml信息,还可以将xml转换为json格式数据

4、xml解析-python的xml.etree.ElementTree

断言体系

python、pytest自带的断言

assert、assertEqual断言

简单易用,功能较少,并且在写入多个断言时,前面的断言失败后,后面的断言无法执行

但是不支持多个条件的逻辑运算,比如多个条件,只要有一个成立即可

 

Hamcrest断言

hamcrest是一个标准断言体系,很多语言都对这个进行了实现

python:

https://github.com/hamcrest/PyHamcrest

python中是以assert_that作为关键字

 

assert_that断言

GitHub官网给的代码示范:

from hamcrest import *
import unittest


class BiscuitTest(unittest.TestCase):
    def testEquals(self):
        theBiscuit = Biscuit("Ginger")
        myBiscuit = Biscuit("Ginger")
        assert_that(theBiscuit, equal_to(myBiscuit))


if __name__ == "__main__":
    unittest.main()

使用assert_that进行断言

    def test_hamcrest_equalto(self):
        r = requests.get('https://ceshiren.com/categories.json')
        # assert r.json()['category_list']['categories'][0]['name'] == '开源项目'
        print(jsonpath(r.json(), '$..name')[0])
        assert_that(jsonpath(r.json(), '$..name')[0], equal_to('开源项目'))

schema断言

这不是一个断言提示,而是说json数据有自己对应数据格式的scheme

有一个接口,有几十个字段,先给特定的json生成它的schema,然后调用第三库,完成对它的schema校验,自动去判断数据类型有没有变化

如何实现,看下面的代码:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值