zoukankan      html  css  js  c++  java
  • python内置模块之unittest测试(五)

    系列文章

    单元测试模块unittest

    • unittest的四个核心的概念:

    TestLoader:加载或分发测试任务的调度器;

    TestCase:测试用例的对象;

    TestSuite:多个测试用例的容器;

    TextTestRunner:执行测试用例的工作者;

    TextTestResult:测试结果保存的对象;

    fixture:搭建一个测试环境;

    # 使用断言方法
    assertEqual     如果两个值相等,则pass
    assertNotEqual  如果两个值不相等,则pass
    assertTrue      判断bool值为True,则pass
    assertFalse     判断bool值为False,则pass
    assertIsNone    不存在,则pass
    assertIsNotNone 存在,则pass
    
    • 如果断言错误,就会报assertionError错误;

    简单测试实例

    # mytest.py
    def add(a, b):
        return a+b
    
    def minus(a, b):
        return a-b
    
    def multi(a, b):
        return a*b
    
    def divide(a, b):
        return a/b
    
    # test.py
    import unittest
    from mytest import *
    
    class MathTest(unittest.TestCase):
        '''测试main模块'''
        def test_add(self):
            '''测试add函数'''
            self.assertEqual(2,add(1,1))
    
        def test_minus(self):
            '''测试minus函数'''
            self.assertEqual(2,minus(3,1))
    
        def test_multi(self):
            '''测试multi函数'''
            self.assertEqual(15,multi(3,5))
    
        def test_divide(self):
            '''测试divide函数'''
            self.assertEqual(2,divide(10,5))
    
    if __name__ == '__main__':
        unittest.main(verbosity=1)
    
    

    执行test.py文件获得测试的结果。

    知识点

    1. 每个继承TestCase的类都是一个测试用例,其中的每一个以test开头的方法都是一个测试实例;

    2. 测试的实例必须以test开头,否则无法被识别;在方法下面加注释后,在测试的结果终端可以显示;

    3. 测试的执行时没有顺序的,完后后标志:成功是 .,失败是 F,出错是 E,跳过是 S。

    4. unittest.main中的verbosity方法可以控制报告的详细程度,设为 0,则不输出每一用例的执行结果;如果设为 2,则输出详细的执行结果,默认为1;

    setUP()和tearDown()

    • 如果需要在测试前做一些准备工作,测试后一些扫尾的工作,使用setUp和tearDown函数;
    import unittest
    class MathTest(unittest.TestCase):
        '''测试main模块'''
        def setUp(self):
            """测试前的准备工作"""
            pass
    
        def tearDown(self):
            """测试后的工作"""
            pass
    
    • 上述两个方法会在每个testcase执行的前后执行,如果想所有的测试实例只执行一次准备和结尾的工作,使用:
    import unittest
    class MathTest(unittest.TestCase):
        '''测试main模块'''
        @classmethod
        def setUpClass(cls):
            """测试前的准备工作"""
            pass
    
        @classmethod
        def tearDownClass(cls):
            """测试后的工作"""
            pass
    
    

    多个测试模块的集成

    • 如果有多个测试文件,每个都去手动执行的方式是不现实的,可以使用TestSuite。
    # test_suite.py
    import unittest
    from mytest import MathTest
    
    if __name__ == '__main__':
        # 创建一个TestSuite的容器
        suite = unittest.TestSuite()
        # 添加测试用例,指定按照添加的顺序来
        tests = [MathTest("test_add"), MathTest("test_minus"), MathTest("test_divide")]
        # 在容器中加入
        suite.addTests(tests)
        # 可以加入单个
        # suite.addTest(MathTest("test_minus"))
        # 有时候我们并不关注执行的顺序
        tests2 = unittest.TestLoader().loadTestsFromTestCase(MathTest)
        tests1 = unittest.TestLoader().loadTestsFromTestCase(MathTest)
        # 以列表的形式加入,tests1和tests2是一个容器,容器可以嵌套容器
        suite.addTests([test1,test2])
        # 一般结果默认输出到终端,可以设置输出到文件
        with open('UnittestTextReport.txt', 'a',encoding='utf-8') as f:
            runner = unittest.TextTestRunner(stream=f, verbosity=2)
            runner.run(suite)
    

    跳过某些测试

    • 在测试的testcase添加装饰器;
    1. unittest.skip(reason):无条件跳过,reason可以用来写跳过的原因。

    2. unittest.skipIf(condition, reason):当condition为True是跳过;condition可以是一个函数,类等任何对象;

    3. unittest.skipUnless(condition, reason):当condition为False是跳过;

    class MathTest(unittest.TestCase):
        '''测试main模块'''
    
        @unitteat.skip('skip this add')
        def test_add(self):
            '''测试add函数'''
            self.assertEqual(2,add(1,1))
    
  • 相关阅读:
    Elementary Methods in Number Theory Exercise 1.2.25
    Elementary Methods in Number Theory Exercise 1.2.14
    图解欧几里德算法
    图解欧几里德算法
    Elementary Methods in Number Theory Exercise 1.2.14
    Android中的长度单位详解(dp、sp、px、in、pt、mm)
    分享下多年积累的对JAVA程序员成长之路的总结
    android异常之都是deamon惹的祸The connection to adb is down, and a severe error has occured.
    TomatoCartv1.1.8.2部署时报错
    JavaScript浏览器对象之二Document对象
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/8761816.html
Copyright © 2011-2022 走看看