美文网首页
第32讲 Unittest单元测试框架

第32讲 Unittest单元测试框架

作者: 天涯海角之路 | 来源:发表于2020-06-01 12:25 被阅读0次

    单元测试框架提供功能如下:

    1. 用例组织和执行
    2. 丰富的断言方法。检查点
    3. 丰富的日志

    重要概念

    1. TestCase。测试用例是最小的测试单元,用于检查特定输入集合的特定返回值
    2. TestSuite。测试套件是测试用例的集合,用于组装一组要允许的测试
    3. TestRunner。用于协调测试的执行并向用户提供结果
    4. TestFixture。准备执行测试的所需环境,以及关联的清理动作

    unittest框架流程

    1. 写好TestCase
    2. 由TestLoader加载TestCase到TsetSuite
    3. 由TextTestRunner运行TestSuite,并把结果保存在报告中

    断言方法

    断言方法汇总.png

    代码示例

    calculator.py
    
    class Calculator:
        def __init__(self, a, b):
            self.a = int(a)
            self.b = int(b)
    
        def add(self):
            return self.a + self.b
    
        def mul(self):
            return self.a * self.b
    
    test_calculator.py
    
    import unittest
    from calculator import Calculator
    
    class MyTest(unittest.TestCase):
        def setUp(self) -> None:
            print("test start")
    
        def test_add1(self):
            r = Calculator(1, 2)
            self.assertEqual(r.add(), 3)
    
        def test_add2(self):
            r = Calculator(3, 4)
            self.assertEqual(r.add(), 5)
    
        def test_mul(self):
            r = Calculator(5.7, 6)
            self.assertEqual(r.mul(), 30)
    
        def tearDown(self) -> None:
            print("test end")
    
    if __name__ == '__main__':
        ###
    

    1.用addTest方法添加单个测试

    if __name__ == '__main__':
        suite = unittest.TestSuite()
        suite.addTest(MyTest("test_add1"))
        suite.addTest(MyTest("test_mul"))
    
        runner = unittest.TextTestRunner()
        runner.run(suite)
    

    2.用addTests方法添加多个测试(以list的形式)

    if __name__ == '__main__':
        suit = unittest.TestSuite()
        case_list=[MyTest("test_add1") , MyTest("test_mul")]
        suit.addTests(case_list)
    
        runner = unittest.TextTestRunner()
        runner.run(suit)
    

    3.添加某TestCase下的所有测试

    if __name__ == '__main__':
        suit = unittest.TestSuite()
        loader = unittest.TestLoader()
        test_class = loader.loadTestsFromTestCase(MyTest)
        suit.addTest(test_class)
    
        runner = unittest.TextTestRunner()
        runner.run(suit)
    

    总结

    1. 三个类对象:TestCase、TestSuite、TextTestRunner
    2. 两次传参:
      2.1 把TestCase对象传入TestSuite
      2.2 把TestSuite对象传入TextTestRunner以启动runner

    用unittest.main()

    单个用例管理.png

    unittest.main方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们

    if __name__ == '__main__':
        unittest.main()
    

    测试模型

    1. 线性测试
    1.1 概念:通过录制或编写对应应用程序的操作步骤产生的线性脚本
    1.2 优点:每个脚本相对独立,且不产生其他依赖和调用,任何一个测试用力脚本拿出来都可以单独执行
    1.3 缺点:开发成本高,用例之间存在重复的操作

    2. 模块化驱动测试
    2.1 概念:将重复的操作独立成共享模块(函数、类),当用例执行过程中需要用到这一模块操作的时候才被调用
    2.2 优点:最大限度消除了重复,提高了开发效率和测试用例的可维护性
    2.3 缺点:当模块化的步骤相同,仅测试数据不同时,需要重复写测试代码

    3. 数据驱动测试
    3.1 概念:它将测试中的测试数据和操作分离,数据存放在另外一个文件中单独维护。通过数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变
    3.2 优点:通过这种方式,将数据和重复操作分开,可以快速增加相似测试,完成不同数据情况下的测试
    3.3 缺点:数据的准备工作

    相关文章

      网友评论

          本文标题:第32讲 Unittest单元测试框架

          本文链接:https://www.haomeiwen.com/subject/cryjzhtx.html