初使用RequestsLibrary做接口测试时,你会不会感到困惑,为什么会有${resp.content}, ${resp.status_code}这样的写法,这个status_code什么鬼,f5查的时候怎么没说明这个东西,为什么写Demo的人知道可以这么写,我少写个’_’可不可以,还有其它啥高端玩法是我不知道的,这玩意的使用说明到底保存在哪啊喂! 说到这个,我们先来了解一下,返回的${resp}是个什么类型的对象,在rf上用个巧妙的方法查看: 运行这段脚本,第4行的打印结果是:INFO : <class 'requests.models.Response'> 从结果可以看出${resp}是一个类对象,源码可在requests/models/Response查看,对象句点操作一般是取对象属性,顺藤摸瓜,找出该类的所有属性,第6行打印结果: ['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__iter__', '__module__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url'] 粗体的是比较重要的,今后会被频繁使用的属性: content: 响应body的内容,二进制编码,如果返回只有文本内容,和text差不多 cookies:响应回写的cookies,cookieJar类对象 headers: 响应头内容 json(): 响应body内容,json格式 status_code: 状态码 text: 响应body的内容,默认unicode编码 一、状态码 状态码什么的,百度上讲的肯定比我讲得清楚,我就不讲了。 另外,一般来说,系统内部会有一个自定义的响应码,与http的状态码不可混淆。 这里主要讲一下RequestsLibrary中对30X状态码的处理,默认情况下,RequestsLibrary的重定向是开着的,也就是说,如果请求返回的状态码为302,它会自动帮你访问重定向地址,并最终返回重定向地址的状态码。具体画风如何,请查看Demo: 二、处理一个简单的响应 响应body: { "origin": "183.16.189.96" } 不多说了,看图:第8行关键字需导入Collections库 三、处理多层级的响应body 这是一个一般复杂的响应body,多层级的json,实际中,你可能要取到某个nickName为“ test1”的数据并校验。 { "api": "api.name", "v": "1.0", "code": "10000", "error_msg": "success", "data": { "userlist": [{ "uid": "94901", "nickName": "test1", }, { "uid": "1010640", "nickName": "test2", }, { "uid": "1012130", "nickName": "test3", }] } } 还是希望大家有点python基础,这种json返回格式,一层层地来抽丝剥茧,{}为字典,用字典运算符,为list,用列表运算符,假设上面那个json是我的响应body。 取第一个nickName的值应该是这样:${resp.json()[‘data’][‘userlist’][0][‘nickName’]},log该变量,值应为:test1。用大白话解释这个表达式就是:把最外面的字典里的data的值里边的userlist的值的第一个字典元素取出来,再对这个字典里的nickName的值。好吧,我已经尽我最大能力翻译了。 另外还有人,可能想一次把所有列表中的nickName取了,也有个简单的办法: 这个用法有点炫酷,细说起来可以整成一个熟练使用rf+evaluate装逼指南系列。这是题外话了。对于初学者,还是1 要懂点python, 2 要懂rf和python之间的表达切换,rf里最好的调试语句是log。建议多写多log。 |
|
来自: 小猪窝969 > 《robot framework》