这篇文章上次修改于 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)