这篇文章上次修改于 588 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
定义
单元测试
- 通常用于判断某个特定条件(或场景)下某个特定函数的行为。
常用的单元测试覆盖类型
语句覆盖
- 通过设计一定量的测试用例,保证被测试的方法每一行代码都会被执行一遍
- 运行测试用例的时候被集中的代码行即称为被覆盖的语句
判断覆盖:
- 使得每一个判定获得每一种可能的结果
- 仅判断整个判断语句的结果,未考虑其内部的逻辑条件组合,会遗漏
条件覆盖
- 使得每一个表达式获得每一种可能的结果
- 用例指数级增长
路径覆盖
- 覆盖所有可能执行的路径
unittest
组件
- test fixture - 测试装置。完成测试前准备、测试后清理操作
- test case - 测试用例
- test suite - 测试套件
- test runner - 运行器。执行测试和提供结果
编写规范
- 测试模块首先 import unittest
- 测试类必须继承 unittest.TestCase
- 测试方法必须以 test 开头
方法
- setUp() - 测试环境准备,在每一个测试方法前运行
- tearDown() - 测试环境清理,在每一个测试方法后运行
- setUpClass() - 在当前测试类的所有测试方法执行前运行
- tearDownClass() - 在当前测试类的所有测试方法执行后运行
执行方法
方法一:执行当前文件所有的unittest测试用例,全部执行
if __name__ == '__main__':
unittest.main()
方法二:执行指定的测试用例,将要执行的测试用例添加到测试套件里面,批量执行测试方法
if __name__ == '__main__':
#方式二:执行指定的测试用例,将要执行的测试用例添加到测试套件里面,批量执行测试方法
#创建一个测试套件,testsuite
suite = unittest.TestSuite()
#将测试用例添加到测试套件中
suite.addTest(TestSearch1("test00"))
suite.addTest(TestSearch1("test_search3"))
#使用unittest.TextTestRunner()方法执行suite套件
unittest.TextTestRunner().run(suite)
方法三:执行某个测试类,将测试类添加到测试套件里面, 批量执行测试类
if __name__ == '__main__':
#方式三:执行某个测试类,将测试类添加到测试套件里面, 批量执行测试类
#将测试类添加到测试套件中
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSearch)
suite2 = unittest.TestLoader().loadTestsFromTestCase(TestSearch1)
#创建一个测试套件
suite = unittest.TestSuite([suite1,suite2])
unittest.TextTestRunner(verbosity=2).run(suite)
#方式二和方式三都需要创建测试套,区别在于添加用例的方式不同,一个是用addTest方法,添加测试类中的测试用例;一个是是用TestLoader添加测试类
#将要执行的用例全部添加到测试套件suite后,就可以运行套件从而执行用例
方法四:匹配某个目录下所有满足unittest规则的测试用例,执行这些py文件下的所有测试用例
import unittest
#入口方法
if __name__ == '__main__':
#在当前路径下找到要执行的模块路径
test_dir = "./testcases"
#将要执行的所有用例添加到discover
discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
unittest.TextTestRunner().run(discover)
uinittest 运行顺序
TestCase TestLoader TestSuit TestRunner
HtmlTestRunner 测试报告生成
- 使用HTMLTestRunner.run() 方法替换了 unittest.TextTestRunner().run()
import unittest
from HTMLTestRunner_PY3 import HTMLTestRunner
if __name__ == '__main__':
report_file = 'report.html'
report_title = '我的测试报告'
desc = '用于展示修改样式后的HTMLTestRunner'
# 在当前路径下找到要执行的模块路径
test_dir = "./testcase"
# 将要执行的所有用例添加到discover
discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
with open(report_file, 'wb') as report:
runner = HTMLTestRunner(stream=report, title=report_title, description=desc)
runner.run(discover)