该文章仅仅是本人单元测试学习的总结复盘笔记,有错误还请多多指教
requests库的使用
- 创建一个py文件(test_demo/http_request.py),先使用python的requests 库来完成http请求并封装起来可以后续写单元测试进行导入
import requests
"""利用requests封装get和post请求"""
class HttpRequest():
def http_request(self, url, data, method, cookie=None):
"""url: 请求地址 http://XXXX:port
param: 传递参数,非必填参数,字典的格式传递参数
method:请求方式 支持get 以及post 字符串形式的参数
cookie:请求的时候传递的cookie值"""
if method.lower() == "get": # 判断请求方式是"get"并且是小写
res = requests.get(url, data, cookies=cookie) # 响应结果的消息实体
else:
res = requests.post(url, data, cookies=cookie) # 响应结果的消息实体
return res # 返回一个消息实体
有关requests的学习网站:
链接: 快速上手 — Requests 2.18.1 文档
可以练手的开放API:
链接1: Apifox Echo
链接2: httpbin.org
unittest
- 创建编写用例的文件(test_demo/test_suite.py)
- 编写用例
import unittest # 导入unittest 库
from test_demo.http_request import http_request # 导入上文所写的http_requests文件
COOKIE = None # 设置全局变量
class TestHttp(unittest.TestCase):
def setUp(self):
self.login_url = "https://xxx/sign_in" # 登录页
self.login_data = {"user[login]": "username", "user[password]": "password"}
self.topics_url = "https://xxx/topics" # 话题页
# 获取登录后的cookie (方法一)
# self.cookies = HttpRequest().http_request(self.login_url, self.login_data, 'get').cookies
def test_login_normal(self): # 正常登录
global COOKIE # 声明全局变量
data = {"user": "user", "password": "812"}
res = HttpRequest().http_request(self.login_url, data, 'post') # 请求登录接口
if res.cookies: # 如果cookie有的话,就更新COOKIE(获取cookie方法二)
COOKIE = res.cookies
try:
self.assertEqual(200, res.status_code) # 断言,判断json里的'code'是否等于'200'
except AssertionError as e:
print("error is{}".format(e))
raise e # 有异常的情况需要抛出
def test_login_wrong_pwd(self): # 密码为空
url2 = "https://testerhome.com/account/sign_in"
data2 = {"user": "user", "password": " "}
res_1 = HttpRequest().http_request(url2, data2, 'post')
print(res_1.status_code)
try:
self.assertEqual(401, res.status_code) # 断言,判断json里的'code'是否等于'401'
except AssertionError as e:
print("error is{}".format(e))
raise e # 有异常的情况需要抛出
def test_get_topics(self):
global COOKIE
topics_res = HttpRequest().http_request(self.favorites_url, data=None, method='get', cookie=COOKIE)
print(topics_res.text) # 打印请求到的内容方便检查是否访问成功
try:
self.assertEqual(200, favorites_res.status_code) # 断言,判断json里的'code'是否等于'200'
except AssertionError as e:
print("error is{}".format(e))
raise e # 有异常的情况需要抛出
def tearDown(self):
pass
if __name__ == '__main__': # 只在当前文件生效的方法
unittest.main() # 运行所有的case
- 存储,加载,运行测试用例
import unittest
import HTMLTestRunner # 导入生产测试报告的库
# from test_demo.test_http import TestHttp # 导入具体类
from test_demo import test_http # 导入具体模块
# 一、创建存储测试用例的容器
suite = unittest.TestSuite()
#二、加载用例(有三种方式)
# suite.addTest(TestHttp("test_001")) # 1.单独加载一条用例
loader = unittest.TestLoader() # 先创建一个加载器
# 3.suite.addTest(loader.loadTestsFromTestCase(TestHttp)) # 2.加载类里面的用例
suite.addTest(loader.loadTestsFromModule(test_http)) # 3.加载模块里面的用例
# 三、执行用例并输出html报告:通过上下文管理器
with open("test_report.html", "wb", encoding="utf-8") as file:
runner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title=None, description=None) # verbosity,2最详细
runner.run(suite)
# 只执行用例不输出文件报告
# runner = unittest.TextTestRunner()
# runner.run(suite)
如果没有导入HTMLTestRunner 的情况想要输出测试报告,也可以选择直接修改文件后缀名生成文本测试报告(test_report.txt)