unittest+unittestreport
1、什么是unittest
unittest是Python单元测试框架,是Python自带的标准库
2、unittest的4个核心组件
a、TestCase:测试用例类,用来定义测试用例函数的
b、TestSuite:测试套件,用来收集测试用例的
c、TestRunner:测试用例运行类,用来执行测试用例的,以测试套件的维度去执行
d、TestFixture:测试脚手架,通过覆盖 TestCase的setUp()和tearDown()方法来实现
3、测试流程
a、TestCase:先定义测试用例类,在测试用例类中写测试方法
b、TestSuite:收集要执行的测试用例类或者文件中的测试方法,放到测试套件中
c、TestRunner:把收集好的测试套件放到测试用例运行器去执行,并收集测试结果
d、TestFixture:做好前置条件和后置处理
4、注意点
a、测试用例类必须以Test开头
b、测试方法必须以test开头
c、可以在main程序入口中通过unittest.main()来启动自动化测试程序,但是这不灵活,也缺失了套件的内涵,所以这里只详细介绍通过套件来执行自动化测试程序的方法(详见9)
5、测试用例包含哪些东西
a、前置条件(若没有就不写):sql语句执行、数据库连接、工具类的实例化等
b、测试步骤(业务逻辑):数据替换、数据驱动等
c、测试结果断言:响应结果断言、数据库数据断言
d、后置处理(若没有就不写):数据清理、数据库连接关闭等
6、前置后置
a、类级别
整个当前测试用例类执行之前(后)执行一次
@classmethod
def setUpClass(cls) -> None:
print('类级别的前置')
@classmethod
def tearDownClass(cls) -> None:
print('类级别的后置')
b、函数级别
每个测试用例执行之前(后)执行一次
def setUp(self) -> None:
print('函数级别的前置')
def tearDown(self) -> None:
print('函数级别的后置')
7、用例执行
测试用例函数按照函数名的ASCII码顺序来执行(0-9<A-Z<a-z)
8、用例断言
一般使用assertEqual(a,b)即可
unittest中断言根据用例是否抛出异常来判断用例方法是成功还是失败,所以,当使用try except捕获异常时,记得手动抛出异常raise
9、用例的收集
这里讲解最常用、最通用的以模块为维度来添加测试用例的方法
在自动化项目目录下新建一个start.py作为自动化测试程序的启动入口
import unittest
# 创建测试套件,其中:
# start_dir:测试文件目录
# pattern:测试用例文件名称,非必填,默认是所有test开头的py文件,也可以指定,例如:pattern='test_0*.py'
case_dir = os.path.dirname(__file__)
suite = unittest.defaultTestLoader.discover(start_dir=os.path.join(case_dir, 'cases'))
# 创建执行器
runner = unittest.TextTestRunner()
runner.run(suite)
如上便是unittest自带的TextTestRunner提供的测试报告,.代表用例通过,F代表用例失败
10、集成unittestreport
自带的TextTestRunner执行器给出的测试结果很不直观友好,这里使用第三方库unittestreport来集成unittest,可以实现测试报告、测试图表、发送测试报告邮件等功能
关于邮箱的smtp服务授权码的获取以及各邮箱系统的smtp地址请自行百度,相关资料很多,此处不做累述
将start.py中的代码全部清除,替换如下:
import unittest
from unittestreport import TestRunner
case_dir = os.path.dirname(__file__)
# pattern:测试用例文件名称,非必填,默认是所有test开头的py文件,也可以指定,例如:pattern='test_0*.py'
suite = unittest.defaultTestLoader.discover(start_dir=os.path.join(case_dir, 'cases'))
runner = TestRunner(suite=suite,
filename="report.html",
report_dir="./reports",
title='测试报告',
tester='xxx',
desc="xxx",
templates=2)#模板 1、2
runner.run()
runner.send_email(host='smtp.qq.com',
port=465,
user='xxx@qq.com',
password='xxx',#smtp服务授权码
to_addrs='xxx@qq.com')#收件人为多人时:['...', '...', '...']
附图:
项目目录
测试报告