zoukankan      html  css  js  c++  java
  • 013- unittest单元测试框架

    unittest单元测试框架

    重要的概念

    1. TestCase
    TestCase 是最小的测试单元,用于检查特定输入集合的特定返回值。unittest提供了TestCase基类,我们创建的测试类需要继承该基类,它可以用来创建新的测试用例
    2. TestSuite
    测试套件是测试用例、测试套件或两者的集合,用于组装一组要运行的测试。unittest提供了TestSuite类来创建测试套件
    3. Test Runner
    Test Runner是一个组件,用于协调测试的执行并向用户提供结果。unittest提供了TextTestRunner类运行测试用例
    4. TestFixture
    TestFixture代表执行一个或多个测试所需的环境准备,以及关联的清理动作。uinttest提供了setUp( )/tearDown( )、setUpClass( )/tearDownClass( )


    TestSuite

    调用TestSuite类下面的addTest( )来添加测试用例。因为一次只能添加一条用例,所以需要指定测试类及测试方法

    suit = unittest.TestSuite()
    suit.addTest(Calculator("test_add"))
    suit.addTest(Calculator("test_sub"))

    1. 通过测试套件添加顺序可以控制测试用例的执行顺序
    2. 当一个测试文件中有很多测试用例时,并不是每次都要执行所有的测试用例,因而可以通过测试套件和运行器可以灵活的控制要执行的测试用例


    discover方法

    unittest提供了defaultTestLoader类中的discover( )方法,可以从多个文件中查找测试用例

    discover(start_dir,pattern="test*.py",top_level_dir=None )

    1. start_dir:待测试的模块名或测试用例目录
    2. pattern="test*.py":测试用例文件名的匹配原则。此处匹配文件名以"test"开头的“.py”类型的文件,星号“*”表示任意多个字符
    3. top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,则默认为None

    import unittest
    # 定义测试用例的目录为当前目录中的test_case目录
    test_dir = r"./test_case" suit = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py") if __name__ == "__main__": runner = unittest.TextTestRunner() runner.run(suit)

    如果将discover( )方法中的start_dir 参数定义为“./test_case目录,那么只能加载test_a.py文件中的测试用例。如果想让unittest查找test_case/下子目录中的测试文件,需要在每个子目录下放一个__init__.py文件。__init__.py文件的作用是将一个目标标记成一个标准的Python模块


    跳过测试和预期失败

    在运行测试时,有时需要直接跳过某些测试用例,或则当测试用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败。unittest提供了实现这些需求的装饰器

    unittest.skip(reason)
    无条件的跳过装饰的测试,需要说明跳过测试的原因
    unittest.skipIf(condition,reason)
    如果条件为真,则跳过装饰的测试
    unittest.skipUnless(condition,reason)
    当条件为真时,执行装饰的测试
    unittest.expectedFailure()
    不管执行结果是否失败,都将测试标记为失败

    import unittest
    
    class Mytest(unittest.TestCase):
    @unittest.skip("直接跳过测试")
    def test_skip(self):
    print("aaa")
    
    @unittest.skipIf(3 > 2 ,"条件为真,跳过测试")
    def test_skipIf(self):
    print("bbb")
    
    @unittest.skipUnless(3 > 2,"条件为真,执行用例")
    def test_skipUnless(self):
    print("ccc")
    
    @unittest.expectedFailure
    def test_expectedFailure(self):
    self.assertEqual(2,3)
    
    
    if "__name__" == "__main__":
    unittest.main()

    执行结果

    Skipped: 直接跳过测试
    
    Skipped: 条件为真,跳过测试
    ccc
    
    
    Ran 4 tests in 0.006s
    
    OK (skipped=2, expected failures=1)

    单元测试部分代码:

    1. 创建一个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 sub(self):
            return self.a - self.b
    
        def mul(self):
            return self.a * self.b
    
        def div(self):
            return self.a / self.b

    2. 通过unittest单元测试框架编写测试用例

    import unittest
    from Calculator import Calculator
    
    class TestCalculator(unittest.TestCase):
        def test_add(self):
            c = Calculator(3,5)     # type(c):<class 'Calculator.Calculator'>
            result = c.add()        # type(result):<class 'int'>
            self.assertEqual(result,8)
    
        def test_sub(self):
            c = Calculator(13,5)
            result = c.sub()
            self.assertEqual(result, 8)
    
        def test_mul(self):
            c = Calculator(2,3)
            result = c.mul()
            self.assertEqual(result,5)
    
        def test_div(self):
            c = Calculator(6,3)
            result = c.div()
            self.assertEqual(result,2)
    
    
    if __name__ == "__main__":
        unittest.main()

    3. 创建测试套件跟测试运行器

    import unittest
    from Calculator import Calculator
    
    class TestCalculator(unittest.TestCase):
        # 测试用例前置动作
        def setUp(self):
            print("test start:")
        # 测试用例后置动作
        def tearDown(self):
            print("test end:")
    
        def test_add(self):
            c = Calculator(3,5)     # type(c):<class 'Calculator.Calculator'>
            result = c.add()        # type(result):<class 'int'>
            self.assertEqual(result,8)
    
        def test_sub(self):
            c = Calculator(13,5)
            result = c.sub()
            self.assertEqual(result, 8)
    
        def test_mul(self):
            c = Calculator(2,3)
            result = c.mul()
            self.assertEqual(result,5)
    
        def test_div(self):
            c = Calculator(6,3)
            result = c.div()
            self.assertEqual(result,2)
    
    
    if __name__ == "__main__":
        # 创建测试套件
        suit = unittest.TestSuite()
        suit.addTest(Calculator("test_add"))
        suit.addTest(Calculator("test_sub"))
        suit.addTest(Calculator("test_mul"))
        suit.addTest(Calculator("test_div"))
        # 创建测试运行器
        runner = unittest.TextTestRunner()
        runner.run(suit)
  • 相关阅读:
    #{}和${}的区别
    Shiro 的优点
    SpringSecurity 和 Shiro的之间的比较
    shiro的组件
    Apache Shiro 的三大核心组件
    Maven的工程类型有哪些?
    Maven仓库是什么
    什么是Maven?
    shiro有哪些组件?
    Apache Shiro 的三大核心组件
  • 原文地址:https://www.cnblogs.com/kkkhycz/p/11674722.html
Copyright © 2011-2022 走看看