UnitTest 是开发人员用来实现 “单元测试” 的框架。测试工程师,可以在自动化 “测试执行” 时使用。
使用 UnitTest 的好处:
- 方便管理、维护测试用例。
- 提供丰富的断言方法。
- 生成测试报告。(需要插件 HTMLTestReport)
UnitTest框架回顾
- TestCase
# 1 导包:import unittest# 2 定义测试类从 TestCase 类继承
class TestXXX(unittest.TestCase):pass# 3 测试方法定义必须以 test 开头。 建议添加 编号!
class TestXXX(unittest.TestCase):def test01_xxx(self):pass
- Fixture
1、方法级别的 setUp(self) tearDown(self) 每个普通方法执行 之前/之后 自动运行。2、类级别的 setUpClass(cls) tearDownClass(cls) 在类内所有方法直 之前/之后 运行一次。
- TestSuite
# 1、实例化测试集对象
suite = unittest.TestSuite()
# 2、添加指定类的全部测试方法。
suite.addTest(unittest.makeSuite(类名))
# Testsuite 通过搜索创建测试集
# suite = unittest.TestLoader().discover(搜索目录, 搜索文件名)
suite = unittest.TestLoader().discover("./", "test*.py")
- TestRunner
runner = HTMLTestReport("./report1.html", description="描述信息", title="报告标题")
runner.run(suite)
- 实例:测试类
py02_unittest_demo.py
"""
unittest 测试框架代码所处文件要求: 遵守 标识符命名规范
1、只能使用 字母、数字、下划线
2、数字不能开头
3、避免使用关键字、已知函数名类: 首字母必须大写 ,建议 以 Test 开头方法:必须 test 开头,建议 编号"""
import unittest# 待测试方法
def add(x, y):return x + y# 封装测试类,从 unittest.TestCase 类继承
class TestAdd(unittest.TestCase):def setUp(self):print("-------setUp------")def tearDown(self):print("--------tearDown-----")@classmethoddef setUpClass(cls):print("======setUpClass=====")@classmethoddef tearDownClass(cls):print("======tearDownClass=====")def test01_add(self):print("测试方法一")ret = add(10, 20)# 断言 响应结果self.assertEqual(30, ret)def test02_add(self):print("测试方法二")ret = add(100, 200)# 断言self.assertEqual(300, ret)
- 示例:生成测试报告
run_suite.py
import unittest
from py02_unittest_demo import TestAdd
from htmltestreport import HTMLTestReport# 创建suite 实例
suite = unittest.TestSuite()# 指定测试类,添加测试方法
suite.addTest(unittest.makeSuite(TestAdd))# 创建 HTMLTestReport 实例
runner = HTMLTestReport("测试报告.html")
# 调用 run() 传入 suite
runner.run(suite)
- 生成测试报告
- Tpshop案例
import unittest
import requests
import ddddocr# ocr = ddddocr.DdddOcr() # 实例化# 定义测试类
class TestTpShopLogin(unittest.TestCase):# 添加测试方法def test01_login_ok(self):# 1、创建一个Session实例session = requests.session()# 2、使用Session 实例,调用 get方法,发送 获取验证码请求。(不需要获取cookie)ver_code_url = "http://192.168.0.105/index.php?m=Home&c=User&a=verify&r=0.6594435226417572"resp_v = session.get(url=ver_code_url)# 保存验证码图片save_path = 'captcha.png'ocr = ddddocr.DdddOcr() # 实例化# 保存图片with open(save_path, 'wb') as f:f.write(resp_v.content)# 打开图片with open('captcha.png', 'rb') as f:# 读取图片img_bytes = f.read()# 识别图片res = ocr.classification(img_bytes)print(res)# 将验证码中的小写转为大写字母,数字和大写字母保持不变res_string = res.upper()print(res_string)# 3. 使用 同一个 Session 实例,调用 post方法,发送 登录请求。(不需要携带 cookie)login_url = "http://192.168.0.105/index.php?m=Home&c=User&a=do_login&t=0.1419723578303651"data = {"username": 13800138006,"password": 123456,"verify_code": res_string}resp = session.post(url=login_url, data=data)# 打印响应结果print(resp.json())# 断言 响应状态码为 200self.assertEqual(200, resp.status_code)# 断言 msg 的值为“登陆成功”self.assertIn("成功", resp.json().get('msg'))# 断言 status的值为 1self.assertEqual(1, resp.json().get('status'))