1、简介:官方自带单元测试框架unittest内置库,不需要使用命令pip install unittest安装,编码直接import导入即可使用;
2、unittest支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。核心组件:TestCase、TestSuite、TextTestRunner、TestFixture(测试脚手架)
测试用例,一个继承unittest.TestCase基类的测试用例类,以test开头的方法就是一个测试用例
测试套件,通过testloader加载类testcase测试用例类到testsuite测试套件,也可以测试套件(测试套件)
测试执行,执行测试用例的入口:测试运行器
测试环境搭建、数据销毁:setup、teardown、setUpClass、tearDownClass
tips:unittest 模块可以通过命令行CLI运行模块、类和独立测试方法的测试:
python -m unittest test_module1 test_module2
python -m unittest test_module1.test_class
python -m unittest test_module1.test_class.test_mthod
3、加载测试用例的方法:
第一步:创建测试套件:suite=unittest.TestSuite()
第二步:将测试用例testcase加载load到测试套件suite中:创建加载对象 loader=unittest.TestLoader()
①、通过模块加载测试用例:suite.addTest(loader.loadTestsFromModule(module_name)),module_name为测试用例类的文件名,不是类名。
②、通过测试用例加载用例:suite.addTest(loader.loadTestsFromTestCase(class_name),class_name为模块下的class类名
③、加载单条测试用例(通过测试用例类创建测试用例对象时,需要传入用例的方法名:字符串类型):case=class_name("testcase_name"),suite.addTest(case)
④、通过加载一个文件夹(执行测试用例所在路径,正则匹配文件夹下模块名加载测试用例)discover=unittest.defaultTestLoader.discover("用例类绝对路径")
tips:loader=unittest.TestLoader(),discover=suite.addTest(loader.discover(dir_path,partten))
第三步:创建测试用例运行启动器:runner=unittest.TextTestRunner(stream="test.txt",verbosity=2),,生成.txt的测试报告(控制台的输出写入到文件中)默认参数为1,2表示输出详细日志。
第四步:使用启动器去执行测试套件:runner.run(suite)
import unittest
# 从网上下载重新优化的html报告模版,放在项目中library目录下
from library.HTMLTestRunnerNew import HTMLTestRunner
# 第一步创建测试套件
suite = unittest.TestSuite()
# 第二步加载测试用
loader = unittest.TestLoader()
# 加载测试用例的几种方式
# 1、加载模块的测试用例
# case = loader.loadTestsFromModule(test_api)
# # 2、加载测试用例类
# case = loader.loadTestsFromTestCase(test_api.RegisterAndLogin)
# 3、加载测试用例类中的测试用例
case = test_api.Test("test_api_001")
suite.addTest(case)
# 终极常用加载测试用例的方式
# discover = unittest.defaultTestLoader.discover("用例类绝对路径", pattern="test*.py")
# suite.addTest(discover)
if __name__ == "__main__":
# # 存放报告的文件夹
report_dir = '../reports'
# # 报告命名时间格式化
now = time.strftime("%Y-%m-%d %H_%M_%S")
# # 报告文件完整路径
report_name = report_dir + '/' + now + "result.html"
#
# # 打开文件再报告文件写入测试结果
with open(report_name, "wb+") as bf:
# 第三步创建测试用例启动器
runner = HTMLTestRunner(
stream=bf, verbosity=2, title="我是测试报告标题", description="描述一下测试报告", tester="是我完成的")
# 第四步运行测试套件
runner.run(suite)
# 关闭报告文件 使用with上下文管理器则不需要此操作
# f.close()
生成报告如下展示:
4、TestFixture用于一个测试环境的准备和销毁还原:当测试用例每次执行之前需要准备测试环境,每次测试完成后还原测试环境,比如执行前连接数据库、打开浏览器等,执行完成后需要还原数据库、关闭浏览器等操作。这时候就可以启用testfixture。
5、unittest框架中的跳过测试
@unittest.skip("强制跳过")
@unittest.skipIf(condition, "条件式,为True则不执行")
@unittest.skipUnless(condition, "条件式:为False则不执行")
装饰器同样适用与测试类!!!
不是注解(装饰器)的取消测试,测试用例中满足条件时调用:self.skipTest(season)
def testName2(self):
if 1 < 3:
self.skipTest("不算")
pass
扩展:@unittest.expectedFailure
把测试标记为预计失败。如果测试不通过,会被认为测试成功;如果测试通过了,则被认为是测试失败。
6、unittest.mock()模拟对象库用于接口依赖联调,一般推荐使用flask框架来mock。
7、上面一笔带过测试报告的生成,一种自带执行器生成txt文本测试报告TextTestRunner,案例使用的是HTMLTestRunner生成html测试报告,样式问题基本比txt会直观一些;
推荐一下:beautifulreport这个相对漂亮的报告模板,需要安装pip install beautifulreport:
import unittest
from BeautifulReport.BeautifulReport import BeautifulReport
class TestLoginMessage(unittest.TestCase):
def test_01(self):
pass
suite = unittest.TestLoader().loadTestsFromTestCase(TestLoginMessage)
run = BeautifulReport(suite)
run.report(description="测试报告2020", filename="report.html", report_dir="../reports", theme="theme_default")
html模版在python中可以称呼jinja2,对于其中页面元素可以自定义修改模版文件。
tips:标准库的意思表示这是一个Python内置模块,不需要额外下载,目前Python内置模块大概有300个。可以在这里查看Python所有的内置模块: