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转成字典

响应的内容

image

image

异常处理

image

上传文件

image

身份验证

image

备注: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()

posted @ 2022-01-04 09:42  bagdje  阅读(42)  评论(0)    收藏  举报