python接口断言

  • 常用的断言方法:r.url, r.status_code, r.headers, r.cookies, r.json, r.request等。
  • 与unittest不同,pytest使用的是python自带的assert关键字来进行断言
  • assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败
一、环境安装
安装 JSON 库:
  • pip install json
  • 状态码断言
二、断言:
1.响应状态码断言
import requests
r = requests.get('http://httpbin.org/get')
assert r.status_code==200
assert 是 Python 的内置函数,用来判断表达式,当表达式条件为 False 的时候就会触发异常。
r.status_code 是 Response 对象内的一个方法,用于获得返回值的状态码。
assert r.status_code==200 就是在判断状态码是否等于200,如果不等于200则会抛出异常。
反例:响应状态码断言,判断响应状态码是否为400
2.JSON响应断言
在测试过程中,大部分接口的返回值都为 JSON 格式。所以,掌握如何对 JSON 响应值进行断言这一技能,可以更轻松的完善接口自动化测试用例。
多种类型响应值断言案例
1)字典格式,通过dict["key"]的方式,拿到value值
2)列表格式,通过 list[index] 拿到对应索引的 value 值。
在 JSON 的断言之中,主要应用的就是字典和列表自带的查找方法。如果碰到混合或者嵌套的情况,只需要一层一层拨开,直到找到需要进行断言的字段即可。
先打印出r.json(),如下:
{'args': {}, 'data': '', 'files': {},
'form': {'hogwarts': ['a', 'b', 'c']},
'headers': {'Accept': '/', 'Accept-Encoding': 'gzip, deflate',
'Content-Length': '32', 'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0',
'X-Amzn-Trace-Id': 'Root=1-5e8a01e3-0913fca09ac605ccc911ccde'},
'json': None, 'origin': '113.118.101.232',
'url': 'http://httpbin.org/post'}
1.1):字典格式断言,判断 headers 中的 Host 为 httpbin.org
import requests
r = requests.post('http://httpbin.org/post', data = {'hogwarts':["a","b","c"]})
assert r.json()['headers']["Host"] == "httpbin.org"
第一层是 key 值为 "header" 的 value
第二层是 key 值为 "Host" 的 value
判断 key 值为 "Host" 的 value 值是否与 " httpbin.org " 相等
2.1):字典混合列表格式断言,判断 hogwarts 对应的列表的第一位是 'a'
import requests
r = requests.post('http://httpbin.org/post',
data = {'hogwarts':["a","b","c"]})
assert r.json()['form']["hogwarts"][0] == "a"
第一层是 key 值为 'form' 的 value
第二层是 key 值为 'hogwarts' 的 value
第三层是索引为 0 的 value
判断上一步索引为 0 的 value 是否等于 "a"
3)断言:headers中的‘content-length'的值与17相等,断言r.status_code的值。
python接口断言_第1张图片
4.常用断言
assert a:判断a为真
assert not a:判断a不为真
assert a in b:判断b包含a
assert a == b:判断a等于b
assert a != b:判断a不等于b
代码
# test_assert.py的内容
class TestAssert(object):
    # 断言1是否大于0
    def test_one(self):
        assert 1 > 0
    # 断言1是否不大于0
    def test_two(self):
        assert not 1 > 0
    # 断言hello是否包含h
    def test_three(self):
        assert 'h' in 'hello'
    # 断言hello是否等于hi
    def test_four(self):
        assert 'hello' == 'hi'
    # 断言hello是否不等于hi
    def test_five(self):
        assert 'hello' != 'hi'
5.jsonpath断言
1)介绍:
用来解析多层嵌套的json数据,JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript,Python,PHP,Java
使用方法:
import jsonpath
res=jsonpath.jsonpath(dic_name,'$..key_name')
#嵌套n层也能取到所有key_name信息,其中:
“$”表示最外层的{},
“..”表示模糊匹配,当传入不存在的key_name时,程序会返回false
2) JsonPath 对于 JSON 来说,相当于 XPath 对于 XML。
  •  安装方法:pip install jsonpath    
  •  官方文档: JSONPath - XPath for JSON
3) JsonPath与XPath语法对比:
Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。
Xpath
JSONPath
描述
/
$
跟节点
.
@
现行节点
/
. or []
取子节点
..
n/a
就是不管位置,选择所有符合条件的条件
*
*
匹配所有元素节点
[]
[]
迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
|
[,]
支持迭代器中做多选
[]
?()
支持过滤操作
n/a
()
支持表达式计算
()
n/a
分组,JsonPath不支持
4)使用实例
d={
"error_code": 0,
"stu_info": [
{
"id": 2059,
"name": "小白",
"sex": "男",
"age": 28,
"addr": "河南省济源市北海大道32号",
"grade": "天蝎座",
"phone": "18378309272",
"gold": 10896,
"info":{
"card":434345432,
"bank_name":'中国银行'
}
},
{
"id": 2067,
"name": "小黑",
"sex": "男",
"age": 28,
"addr": "河南省济源市北海大道32号",
"grade": "天蝎座",
"phone": "12345678915",
"gold": 100
}
]
}
res= d["stu_info"][1]['name'] #取某个学生姓名的原始方法:通过查找字典中的key以及list方法中的下标索引
print(res) #输出结果是:小黑
import jsonpath
res1=jsonpath.jsonpath(d,'$..name') #嵌套n层也能取到所有学生姓名信息,$表示最外层的{},..表示模糊匹配
print(res1) #输出结果是list:['小白', '小黑']
res2= jsonpath.jsonpath(d,'$..bank_name')
print(res2) #输出结果是list:['中国银行']
res3=jsonpath.jsonpath(d,'$..name123') #当传入不存在的key(name)时,返回False
print(res3) #输出结果是:False

接口测试框架实战(二)| 接口请求断言 - 简书题图引用自 Real Python 本文节选自霍格沃兹《测试开发实战进阶》课程教学内容,进阶学习文末加群。 接口请求断言是指在发起请求之后,对返回的响应内容去做判断,用来查看...https://www.jianshu.com/p/70aad4620098

python读取json格式文件大量数据,以及python字典和列表嵌套用法详解_汀、的博客-CSDN博客_python json 批量 读取 追加数据 字典换行符问题导致大量数据,里面有多行多列,出现类似标题报错可以逐行读取,然后再处理成列表。https://blog.csdn.net/sinat_39620217/article/details/126610613

你可能感兴趣的:(python,开发语言)