zoukankan      html  css  js  c++  java
  • unittest (python标准库-开发工具-单元测试框架)

    unittest官方文档摘录 翻译 reffer to: https://docs.python.org/3/library/unittest.html#unittest.TextTestRunner

    第一部分-使用

    1、基本概念

    1.1)unittest单元测试框架最初的灵感来自于JUnit,其特点有

    • 支持测试自动化
    • 为测试共享setup和shutdown代码
    • 可以把单个测试集合成测试用例集
    • 将测试报告框架和测试用例独立开来

    1.2)unittest支持的面向对象的重要理念

    • test fixture
      测试固件:表示一个或多个测试用例需要的准备,以及关联的清理操作,例如:创建临时DB、目录或启动一个进程

    • test case
      测试用例: 一个独立的测试单元,它校验一组输入得到的一个指定的响应,unittest提供一个基类TestCase,用来创建新的测试用例

    • test suite
      测试套件: 一个测试用例的集合,用来集合应该被一起执行的测试用例

    • test runner
      测试执行组件: 安排测试的执行并给用户提供结果

    2、简单实例

    unittest库提供了一系列丰富的工具来构建和执行测试,下面讲一下可以满足大部分用户需求的一个小的工具子集

    import unittest
    
    class TestStringMethods(unittest.TestCase):
    
        def test_upper(self):
        	self.assertEqual('foo'.upper(), 'FOO')
        
        def test_isupper(self):
        	self.assertTrue('FOO'.isupper())
        	self.assertFalse('Foo'.isupper())
        
        def test_split(self):
        	s = 'hello world'
        	self.assertEqual(s.split(), ['hello', 'world'])
        	# check that s.split fails when the separator is not a string
        	with self.assertRaises(TypeError):
        	s.split(2)
    
    if __name__ == '__main__':
    	unittest.main()
    
    • 测试用例继承TestCase类,单个测试方法需要已test开头,这样便于告诉test runner哪些方法代表测试用例
    • 每一个测试均用到了断言行数assert*(),以便于test runner计算测试结果及生成测试报告
    • setUp()和tearDown()方法用于定义一些测试前后的操作
    • unittest.main()为测试脚本提供了一个命令行接口来运行测试

    3、命令行执行测试的方式

    # 您可以像这样执行一个测试模块:
    python -m unittest test_module1 test_module2
    # 也可以执行一个测试类,如:
    python -m unittest test_module.TestClass
    # 或者单独执行一个测试方法
    python -m unittest test_module.TestClass.test_method
    

    4、组织测试代码

    • 测试用例: 单元测试的基础组成模块是 测试用例--必须建立起来并且完成正确性校验的单个场景
    • 编写用例的规范
      • 在unittest框架中,测试用例就是TestCase的实例,所以你必须继承TestCase类来写用例
      • 测试方法必须带self参数,用来单独运行或则组合运行用例
      • assert*()方法是TestCase类提供的,如果测试失败了,它会抛出解释性的说明,unittest则会把这个用例定义为失败,其他的异常都会被视为错误。
      • setUp()方法会在每一个test_func执行之前执行,同理的tearDown
      • 测试用例的执行顺序是测试方法名的字符串排序

    自由组装测试套件

    import unittest
    
    class WidgetTestCase(unittest.TestCase):
    	def setUp(self):
    	self.widget = Widget('The widget')
    
    	def tearDown(self):
    	self.widget.dispose()
    

    def suite():
        suite = unittest.TestSuite()
        suite.addTest(WidgetTestCase('test_default_widget_size'))
        suite.addTest(WidgetTestCase('test_widget_resize'))
        return suite
    
    if __name__ == '__main__':
        runner = unittest.TextTestRunner()
        runner.run(suite())
    

    5、跳过用例

    5.1 跳过一个用例使用skip()装饰器就可以了,下面是几个实例

    class MyTestCase(unittest.TestCase):
    
    @unittest.skip("demonstrating skipping")
    def test_nothing(self):
        self.fail("shouldn't happen")
    
    @unittest.skipIf(mylib.__version__ < (1, 3),
                     "not supported in this library version")
    def test_format(self):
        # Tests that work for only a certain version of the library.
        pass
    
    @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
    def test_windows_support(self):
        # windows specific testing code
        pass  
    

    第二部分-深入unittest APIs

    1、Test cases 测试用例相关

    unittest.TestCase(methodName="runTest")

    • TestCase类的实例展示了unittest宇宙中单元测试逻辑,这个类被设计为基类,由它的子类来实现特定的测试。
    • 这些子类实现test runner需要的接口,来让它控制测试用例和各个失败的检查和报告的测试方法
    • TestCase实例提供三类方法:
      • A: 用来运行测试: setUp() 、tearDown()、setUpClass()、tearDownClass()、run(result=None)、skipTest(reason)
      • B: 用来实现条件检查和报告失败assert*()
      • C: 一些查询信息的方法

    2、Grouping tests 组织测试用例

    unittest.TestSuite(tests=())

    这个类代表一些单独测试用例或测试集的集合,TestSuite的对象有点像TestCase对象,除了它并不真正实现一个测试外,另外,它们用来集成需要一起运行的测试,下面是一些常用方法:

    • addTest(test) 向测试集中加入一个测试用例或测试集
    • addTests(tests) 添加多个test
    • run(result)运行suite关联的测试,收集测试结果放到result中
    • countTestCases()

    3、Loading and running tests 加载并执行测试

    class unittest.TestLoader

    • 用来通过测试类和或者测试模块创建测试集,这个类一般无需实例化,
    • 方法:
      • loadTestsFromTestCase(testCaseClass)
      • loadTestsFromModule(module, pattern=None)
      • loadTestsFromName(name, module=None)
      • loadTestsFromNames(names, module=None)
      • getTestCaseNames(testCaseClass)
      • discover(start_dir, pattern='test*.py', top_level_dir=None)

    class unittest.TestResult

    • TestResult对象保存了测试集的测试结果
    • TestRunner.run()会返回一个TestResult实例,用于生成测试不报告用
      • 结果属性:errors、failures、skipped、testsRun

    class unittest.TextTestResult(stream, descriptions, verbosity)

    • 用TextTestRunner对TestResult的实现
    • 方法:
      • _makeResult():通过运行run函数返回一个TestResult实例。
      • run(test): TextTestRunner的主入口,以TestSuite或TestCase为参数,并输出一个TestResult
      • unittest.main(*):一个从module中载入测试集并执行他们的命令行程序,为了方便测试模块执行。最简单的执行方式是:

    --

    # 执行一个module中的所有用例 
    if __name__ == '__main__':
    	unittest.main()
    

    4、 Class and Module Fixtures

    • class及module级别的固件(Fixture)在测试套件TestSuite中已经实现, 当suite遇到一个新类中的测试用例时,前一个类先tearDown且新的类会setUp固件。Shared fixtures
  • 相关阅读:
    Git 简要教程
    SDK更新失败问题解决
    常用安卓操作
    MongoDB本地安装与启用(windows 7/10)
    windows 快捷键收集
    windows 常用命令
    Lambda Expression Introduction
    对 load_breast_cancer 进行 SVM 分类
    Support Vector Machine
    使用 ID3 对 Titanic 进行决策树分类
  • 原文地址:https://www.cnblogs.com/chengtch/p/10590936.html
Copyright © 2011-2022 走看看