Python接口自动化测试
urllib
get请求:
#-*-coding:utf8-*-
import json
from urllib import request
url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName='
ret = request.urlopen(url)
print(ret.read().decode('utf-8'))
链接中有中文 :
#-*-coding:utf8-*-
import json
from urllib import request
from urllib.parse import quote
url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName=%s' % quote('山东')
ret = request.urlopen(url)
print(ret.read().decode('utf-8'))
requests
使用 requests 模块进行接口测试 pip install requests
requests是使用Apache2 licensed 许可证的HTTP库。
用python编写。
比urllib2模块更简洁。
Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。
在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。
现代,国际化,友好。
requests会自动实现持久连接keep-alive
get
#-*-coding:utf8-*-
import json
# from urllib import request
import requests
url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity?byProvinceName='+'山东'
response = requests.get(url)
print(response.text)
post
这是x-www-form-urlencoded
#-*-coding:utf8-*-
import json
# from urllib import request
import requests
url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName'
data={'theCityName':'天津'}
r = requests.post(url,data)
print(r.text)
入参为json
import requests
import json
data = {'some': 'data'}
data=json.dumps({'some': 'data'})
r = requests.post('https://api.github.com/some/endpoint', data)
print(r.json())
带header
import requests
import json
data = {'some': 'data'}
headers = {'content-type': 'application/json',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)
print(r.text)
json.dumps() 是将字典转成jsonjson.loads()是将json转成字典
响应的内容


异常处理

上传文件

身份验证

备注:http请求的端口,尽量不要用相应的状态码(response.status_code)作为断言,例如:状态码(200),就认为是用例成功,现实中,很多请求,状态码返回 200,实际上是请求失败的。所以用来做断言的条件要准确和唯一。
接口自动化测试框架
通过Requests库发送http接口请求,通过unittest单元测试框架组织和运行测试用例,通过HTMLTestRunner生成HTML格式的测试报告,通过PyMySQL驱动操作MySQL初始化测试数据
为什么要自己开发而不使用测试工具
1 测试数据不可控制,所以要初始化数据
2 测试工具不能测试加密接口
3 扩展能力不足:定时测试、生成不同格式测试报告、将报告发送到指定邮箱
Requests
支持自动编码
接口测试
import requests
# 查询发布会接口
url = "http://127.0.0.1:8000/api/get_event_list/"
r = requests.get(url, params={'eid': '3'})
result = r.json()
# 断言接口返回值
assert result['status'] == 200
集成unittest
import requests
import unittest
class GetEventListTest(unittest.TestCase):
'''查询发布会接口测试'''
def setUp(self):
self.url = "http://127.0.0.1:8000/api/get_event_list/"
def test_get_event_null(self):
'''发布会id为空'''
r = requests.get(self.url, params={'eid': ''})
result = r.json()
self.assertEqual(result['status'], 10021)
self.assertEqual(result['message'], "parameter error")
def test_get_event_error(self):
'''发布会id不存在'''
r = requests.get(self.url, params={'eid': '901'})
result = r.json()
self.assertEqual(result['status'], 10022)
self.assertEqual(result['message'], "query result is empty")
def test_get_event_success(self):
'''发布会id位3,查询成功'''
r = requests.get(self.url, params={'eid': '3'})
result = r.json()
self.assertEqual(result['status'], 200)
self.assertEqual(result['message'], "success")
if __name__ == '__main__':
unittest.main()
关于接口测试的自动化,unittest已经完成大部分工作,只需要集成初始化数据功能,以及使用HTMLTestRunner来生成测试报告,一个接口测试框就基本完成了
测试用例
sec_test_case.py
import unittest
import requests
class GetEventListTest(unittest.TestCase):
'''查询发布会信息(带用户认证)'''
def setUp(self):
self.base_url = "http://127.0.0.1:8000/api/sec_get_event_list/"
def test_get_event_list_eid_success(self):
'''根据eid查询成功'''
auth_user = ('jerry', 'dongkaihui0724')
r = requests.get(self.base_url, auth=auth_user, params={'eid': 3})
result = r.json()
self.assertEqual(result['status'], 200)
if __name__ == "__main__":
unittest.main()

浙公网安备 33010602011771号