python开发接口测试
作用python语言实现web api接口测试, 常用下面的库
内置库: httplib, urllib2
第三方库: requests
python requests库
特点: 1. 简便易用, 功能强大,姐姐我喜欢用这个。
请求参数:
requests.get(url, params=xx, headers=xx)
params =这个参数放在url里
定制请求头:
headers=这个参数放在消息头里, headers接收的是一个字典
传递URL参数:
为URL的查询字符串(query string)传递某种数据。数据以键值对的形式置于URL中, 跟在一个问题后面。 用params关键字参数, 以一个字典来提供这些参数。
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
则URL是 http://httpbin.org/get?key2=value2&key1=value1
注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
还可以将列表做为值传入。
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
则url是http://httpbin.org/get?key1=value1&key2=value2&key2=value3
消息体中发送一些编码为表单形式的数据
传递一个字典给data参数,字典在发出请求时会自动编码为表单形式。
也可以为data参数传入一个元组。 在表单中多个元素使用同一个key的时候,这种方式尤其有效。
payload = (('key1', 'value1'), ('key1', 'value2')) r = requests.post('http://httpbin.org/post', data=payload) print(r.text) { ... "form": { "key1": [ "value1", "value2" ] }, ... }
如果传递的是一个string而不是dict, 那么数据就会被直接发出去。
>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload))
还可以用json参数直接传递, 它会被自动编码。
>>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some': 'data'} >>> r = requests.post(url, json=payload)
如用format, 则用两个{{表示原本{代表
def addCourse(self, name, desc, display_idx=1):
data = {
'action': 'add_course',
方法1:# 'data': '{"name":"%s", "desc":"%s", "display_idx":"%s"}'%(name,desc,display_idx)
方法2:'data':f'''{{
"name":"{name}"
"desc":"{desc}",
"display_idx":"{display_idx}
}}'''
方法3: # 'data':'''{{
# "name":"{}"
# "desc":"{}",
# "display_idx":"{}
# }}'''.format(name,desc,display_idx)
}
rsp = requests.post(BASEURL,data=data)
Body:
x-www-form-urlencode方式,即表单方以式, 用这个消息头会自动加上Content-Type: x-www-form-urlencode方式,参数放在data里
Content-Type: application/json 以json参数发出去, 参数传给json= 参数
xml格式: 也是传到data里
参数是字典,用Data,会自动采用Content-Type:x-www-form-urlencode方式, 如果是普通字符串, Heade头里不会加上Content-Type, 此时,就直接在heads里直接加上Content-Type。
响应:
r = requests.post(...) 返回的r是一个响应对应
r.text 消息体内容, 这个返回的是一个字符串
r.status_code 响应状态码
Request还附带了一个内置的状态码查询对象 r.status_code == requests.codes.ok 返回True或False
如果发送了一个错误请求(4xx,5xx),可以通过rsp.raise_for_status()来抛出异常。如果是200, 返回None
r.headers() 返回响应头,返回的是一个字典,这个字典比较特殊,响应头字段是大小写不敏感的。 r.headers['Content-Type'],r.headers['Content-Type']两者是一样的。
assert '"retcode":0' in r.text ---一种断言。 这种方法不太好,要写得非常小心。
retObj = r.json() #将响应的字符串转化为对应的python对象。
比如转化为字典或是列表。
Cookies
访问cookie: r.cookies['cookie_name']
要想发送你的cookies到服务器,可以使用 cookies 参数:
>>> url = 'http://httpbin.org/cookies' >>> cookies = dict(cookies_are='working') >>> r = requests.get(url, cookies=cookies) >>> r.text