本例的目录结构如下
tests/
├── request_obj.py
├── run_test.py
└── test_public.py
本例使用requests库封装一个请求的类来使用
首先安装requests库
pip install requests
下面就来创建一个文件,命名为request_obj.py,输入一下内容:
import requests
import os
import json
import random
from io import BytesIO
class BaseRequestObj(object):
'''
请求基类
'''
angents = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
]
def __init__(self):
self.request = requests
self.default_headers = {
'User-Agent': random.choice(self.angents)}
def get_request(self, url, params=None, headers=None):
'''
发起GET请求
:url 请求的地址 字符串类型
:params GET请求参数 字典类型
:headers 定义请求头 字典类型
'''
# default_headers = {'Content-Type': 'multipart/form-data'}
if headers:
self.default_headers.update(headers)
return self.request.get(url=url, params=params, headers=self.default_headers)
def post_json_request(self, url, data, headers=None):
'''
发起POST请求 发送json请求体
:url 请求的地址 字符串类型
:data json类型请求体 字典类型
:headers 定义请求头 字典类型
'''
self.default_headers.update({
'Content-Type': 'application/json'})
if headers:
self.default_headers.update(headers)
return self.request.post(url=url, data=json.dumps(data), headers=self.default_headers)
def patch_json_request(self, url, data, headers=None):
'''
发起PATCH请求 发送json请求体
:url 请求的地址 字符串类型
:data json类型请求体 字典类型
:headers 定义请求头 字典类型
'''
self.default_headers.update({
'Content-Type': 'application/json'})
if headers:
self.default_headers.update(headers)
return self.request.patch(url=url, data=json.dumps(data), headers=self.default_headers)
def put_json_request(self, url, data, headers=None):
'''
发起PUT请求 发送json请求体
:url 请求的地址 字符串类型
:data json类型请求体 字典类型
:headers 定义请求头 字典类型
'''
self.default_headers.update({
'Content-Type': 'application/json'})
if headers:
self.default_headers.update(headers)
return self.request.put(url=url, data=json.dumps(data), headers=self.default_headers)
def delete_request(self, url, headers=None):
'''
发起DELETE请求
:url 请求的地址 字符串类型
'''
self.default_headers.update({
'Content-Type': 'application/json'})
if headers:
self.default_headers.update(headers)
return self.request.delete(url=url, headers=self.default_headers)
def post_files_request(self, url, files, headers=None):
'''
发起POST请求 请求体为文件
:url 请求的地址 字符串类型
:files 文件类型请求体 文件类型 例:{'file1': open('img1.png', 'rb'), 'file2': open('1.xls', 'rb')}
:headers 定义请求头 字典类型
'''
if headers:
self.default_headers.update(headers)
return self.request.post(url=url, files=files, headers=self.default_headers)
if __name__ == '__main__':
req_obj = BaseRequestObj()
# 执行一些相应的测试
print(req_obj.get_request('http://127.0.0.1:8080/public/test/', {
'page': 1, 'page_size': 2}).json())
# print(req_obj.post_json_request('http://127.0.0.1:8080/public/test/', {'page': 1, 'page_size': 2}).json())
# print(req_obj.patch_json_request('http://127.0.0.1:8080/public/test/', {'page': 1, 'page_size': 2}).json())
# print(req_obj.put_json_request('http://127.0.0.1:8080/public/test/', {'page': 1, 'page_size': 2}).json())
# file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.py')
# print(req_obj.post_files_request('http://127.0.0.1:8080/public/uploadfile/', {'file': open(file_path, 'rb')}).json())
创建一个名为test_public.py的文件,注意:建议用来测试的文件全部以test_开头
输入以下代码:
import unittest
import os
from request_obj import BaseRequestObj
class TestSubtract(unittest.TestCase):
def setUp(self):
self.req_obj = BaseRequestObj()
self.host_name = 'http://127.0.0.1:8080'
def test_public_test(self):
"""
未传参数
:return:
"""
res = self.req_obj.get_request(self.host_name + '/public/test/')
status_code = res.status_code
res_data = res.json()
self.assertEqual(status_code, 200)
self.assertEqual(res_data.get('errorCode'), 0)
def test_public_test_params(self):
"""
传入相关参数
:return:
"""
res = self.req_obj.get_request(self.host_name + '/public/test/', {
'page': 1, 'page_size': 10})
status_code = res.status_code
res_data = res.json()
self.assertEqual(status_code, 200)
self.assertEqual(res_data.get('errorCode'), 0)
if __name__ == '__main__':
'''
verbosity默认为1
0 (静默模式): 你只能获得总的测试用例数和总的结果。
1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “E”
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息 并且 你在命令行里加入不同的参数可以起到一样的效果
'''
unittest.main(verbosity=2)
在tests目录下运行测试
python test_public.py
测试用例成功的示例如下:
test_public_test (__main__.TestSubtract) ... ok
test_public_test_params (__main__.TestSubtract) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.007s
OK
当我们有多个测试用例时,可以用unittest来帮我们统一执行,并将想要的结果输出到文本中
新增一个run_test.py文件,添加一下代码
import unittest
test_dir = './'
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
if __name__ == '__main__':
with open('UnittestTextReport.txt', 'w') as f:
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(discover)
在tests目录下运行测试
python run_test.py
它会将tests目录下所有以test_开头的文件都执行,并生成一个文本保存测试结果
运行成功后会生成一个文件UnittestTextReport.txt