当请求一个接口,返回数据后,返回的数据由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校验,自动去判断数据类型有没有变化
如何实现,看下面的代码: