美文网首页
unittest-前后置和断言

unittest-前后置和断言

作者: 是立品啊 | 来源:发表于2021-03-02 21:03 被阅读0次

    unittest框架是Python内置的单元测试框架,可以用来做单元测试,接口测试,UI自动化测试。

    简单示例

    import requests
    import unittest
    
    class MyTestCase(unittest.TestCase):
        '''
            类名可以自定义
            但必须继承 unittest.TestCase
            
        '''
    
        def runTest(self):
            response = requests.get(url='http://ip:80/product/getSku?id=1')
            print(response.json())
            if response.json()['message'] == "success":
                print('用例通过')
            else:
                print('用例执行失败')
    
    if __name__ == '__main__':
        unittest.main()
    
    • 针对于上面的示例来说,方法名必须叫runTest,因为在父类(unittest.TestCase)中的初始化方法的methodName参数,来控制我们测试用例的名称:
    class TestCase(object):
        def __init__(self, methodName='runTest'):
            """Create an instance of the class that will use the named test
               method when executed. Raises a ValueError if the instance does
               not have a method with the specified name.
            """
            self._testMethodName = methodName
            self._outcome = None
            self._testMethodDoc = 'No test'
    

    当然你也可以手动指定参数

    if __name__ == '__main__':
        case_obj = MyTestCase(methodName='mytest')
        case_obj.run()
    

    setup和teardown

    有些时候,我们需要在用例执行前后做一些操作,那就:

    • 用例执行之前:setup
    • 用例执行之后:teardown

    它们的执行顺序:

    1. setup,做一些初始化的操作
    2. 测试用例执行
    3. teardown执行,收尾

    注意,上述的执行顺序于它们在类中的位置无关,并且这两个方法名是固定的写法。如果,我们测试用例时,没有初始化和收尾的工作,setUptearDown方法可以省略不写

    import requests
    import unittest
    
    
    class MyTestCase(unittest.TestCase):
        '''
            类名可以自定义
            但必须继承 unittest.TestCase
    
            在测试用例执行之前
            要做一些事情或者进行一些初始化的操作
            在测试用例执行之后,做一些收尾的操作
    
        '''
    
        def setUp(self):
            """ 在测试用例执行之前执行的方法 """
    
            self.response = requests.get(url='http://ip:80/product/getSku?id=1')
            print("在测试用例执行之前触发我执行", self.response.json())
    
        def tearDown(self):
            """ 在测试用例执行之后执行的方法 """
            print("在测试用例执行之后触发我执行")
            del self.response
    
        def mytest(self):
            """ mytest就是测试用例 """
            if self.response.json()['message'] == "success":
                print('用例通过')
            else:
                print('用例执行失败')
    
    
    if __name__ == '__main__':
        case_obj = MyTestCase(methodName='mytest')
        case_obj.run()
    

    setupClass和teardownClass

    场景:

    在测试类中,有多个测试用例,在每一个测试用例执行前后,要做一些操作。
    另外,还有在测试类中,所有用例执行之前要做一些初始化的操作,在所有用例执行之后,要做一的收尾的操作。

    import unittest
    
    class MyTestCase(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            print('在所有用例执行之前做的操作')
        @classmethod
        def tearDownClass(cls):
            print('在所有的用例执行之后做的操作')
    
        def setUp(self):
            print('在用例执行之前做的操作')
    
        def tearDown(self):
            print('在用例执行之后做的操作')
        def test_case_01(self):
            self.assertTrue('FOO'.isupper())   # 'FOO'.isupper() --> True
    
        def test_case_02(self):
            self.assertTrue('FOO'.isupper())
    
        def test_case_03(self):
            self.assertTrue('bar'.islower())
    if __name__ == '__main__':
        suite = unittest.makeSuite(testCaseClass=MyTestCase)
        unittest.TextTestRunner(verbosity=2).run(suite)
    

    断言

    断言:执行结果是否符合预期,符合则说明断言成功,如果符合预期,说明断言失败
    unittest框架提供了丰富的断言方法供我们使用。

    下表列出了最常用的方法:

    Method Checks that description New in
    assertEqual(a, b, msg) a == b 如果a不等于b,断言失败
    assertNotEqual(a, b, msg) a != b 如果a等于b,断言失败
    assertTrue(x, msg) bool(x) is True 如果表达式x不为True,断言失败
    assertFalse(x, msg) bool(x) is False 如果表达式x不为False,断言失败
    assertIs(a, b, msg) a is b 如果a is not 2,断言失败 3.1
    assertIsNot(a, b, msg) a is not b 如果a is b,断言失败 3.1
    assertIsNone(x, msg) x is not None 如果x不是None,断言失败 3.1
    assertIn(a, b, msg) a in b 如果a not in b,断言失败 3.1
    assertNotIn(a, b, msg) a not in b 如果a in b,断言失败 3.1
    assertIsInstance(a, b, msg) isinstance(a, b) 如果a不是b类型,断言失败 3.2
    assertNotIsInstance(a, b, msg) not isinstance(a, b) 如果a是b类型,断言失败 3.2

    示例

    import requests
    import unittest
    
    
    class MyTestCase(unittest.TestCase):
        '''
            类名可以自定义
            但必须继承 unittest.TestCase
    
            在测试用例执行之前
            要做一些事情或者进行一些初始化的操作
            在测试用例执行之后,做一些收尾的操作
    
        '''
    
        def setUp(self):
            """ 在测试用例执行之前执行的方法 """
    
            self.response = requests.get(url='http://ip:port/getSku?id=1')
            print("在测试用例执行之前触发我执行", self.response.json())
    
        def tearDown(self):
            """ 在测试用例执行之后执行的方法 """
            print("在测试用例执行之后触发我执行")
            del self.response
    
        def runTest(self):
            self.assertEqual('success1', self.response.json()['message'])
    
    
    if __name__ == '__main__':
        unittest.main()
    

    执行结果

    在测试用例执行之前触发我执行 {'code': '0', 'message': 'success', 'data': {'skuId': 1, 'skuName': 'ptest-1', 'price': '807', 'stock': 117, 'brand': 'testfan'}
    }
    在测试用例执行之后触发我执行
    F
    ======================================================================
    FAIL: runTest (__main__.MyTestCase)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "4.断言.py", line 59, in runTest
        self.assertEqual('success1', self.response.json()['message'])
    AssertionError: 'success1' != 'success'
    - success1
    ?        -
    + success
    
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.401s
    
    FAILED (failures=1)
    

    注:

    • 用例执行通过,用.表示

    • 执行失败用F表示,并且输入失败的描述信息

    • 一般的self.assertEqual(a, b, msg)

      • a:表示预期值
      • b:实际执行结果
      • 如果a!=b,则断言失败
      • msg(可选参数)如果你想自定义断言信息,使用msg参数,msg="自定义断言信息"

    相关文章

      网友评论

          本文标题:unittest-前后置和断言

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