享受每一天,Just Enjoy !

0%

Python 自动化测试实战 Zero to Hero 单元测试框架unittest的使用 (一)

1. unittest 简介
  • unittest单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格,支持将测试样例聚合到测试集中,并将测试与报告框架独立
    2. unittest应用实例
  • unittest 不需要额外安装,可以直接import使用,来看一下
    1
    2
    3
    4
    5
    6
    7
    ➜  ~ source yiluo/bin/activate
    (yiluo) ➜ ~ python
    Python 3.7.5 (default, Nov 29 2019, 14:32:46)
    [Clang 9.0.0 (clang-900.0.39.2)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import unittest
    >>>
  • 没有报错,说明引入成功了,下面来具体看一个实例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/python3

    import unittest

    class VerifySkillTestCase(unittest.TestCase):
    def test_verify_skill1(self):
    self.assertEqual(skill1, '一骑当千')

    def test_verify_skill2(self):
    self.assertEqual(skill2, '单刀赴会')


    if __name__ == '__main__':
    hero = '关羽'
    skill1 = '一骑当千'
    skill2 = '单刀赴会'
    skill3 = '青龙偃月'
    skill4 = '刀锋铁骑'
    unittest.main()
  • 继承 unittest.TestCase就创建了一个测试样例
  • 测试是三个类的方法,这些方法的命名都以 test 开头,只有test开头的才会被认为是用例
  • 调用 assertEqual()来检查预期的输出,判断英雄的技能是否正确
  • 常用的校验方法有

图片来源官网

1
2
3
4
5
6
(yiluo) ➜  Code python test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
  • 2条用例校验通过

    3. setUp 与 tearDown的使用
  • setUp 测试前置条件

  • tearDown 测试后置条件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/usr/bin/python3

    import unittest

    class VerifySkillTestCase(unittest.TestCase):
    def setUp(self):
    print('检验英雄{}技能'.format(hero))
    def test_verify_skill1(self):
    self.assertEqual(skill1, '一骑当千')

    def test_verify_skill2(self):
    self.assertEqual(skill2, '单刀赴会')

    def tearDown(self):
    print('英雄{}技能校验完毕'.format(hero))

    if __name__ == '__main__':
    hero = '关羽'
    skill1 = '一骑当千'
    skill2 = '单刀赴会'
    skill3 = '青龙偃月'
    skill4 = '刀锋铁骑'
    unittest.main(verbosity=2)
  • 执行看一下结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (yiluo) ➜  Code python test.py
    test_verify_skill1 (__main__.VerifySkillTestCase) ... 检验英雄关羽技能
    英雄关羽技能校验完毕
    ok
    test_verify_skill2 (__main__.VerifySkillTestCase) ... 检验英雄关羽技能
    英雄关羽技能校验完毕
    ok

    ----------------------------------------------------------------------
    Ran 2 tests in 0.001s

    OK
  • 如上校验了英雄的1技能2技能,每次用例的开始会执行setup前置条件,结束后又会执行tearDown

  • 不过比如我们实际使用中,如果获取用户登陆的token ,其实获取一次就可以了,并不需要每次都执行获取token的接口,那要如何处理呢

    4. setUpClass 与 tearDownClass的使用
  • 前置条件后置条件还可以通过setUpClasstearDownClass方法来操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/python3

    import unittest

    class VerifySkillTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
    print('检验英雄{}技能'.format(hero))
    def test_verify_skill1(self):
    self.assertEqual(skill1, '一骑当千')

    def test_verify_skill2(self):
    self.assertEqual(skill2, '单刀赴会')

    def test_verify_skill3(self):
    self.assertEqual(skill3, '青龙偃月')

    @classmethod
    def tearDownClass(cls):
    print('英雄{}技能校验完毕'.format(hero))

    if __name__ == '__main__':
    hero = '关羽'
    skill1 = '一骑当千'
    skill2 = '单刀赴会'
    skill3 = '青龙偃月'
    skill4 = '刀锋铁骑'
    unittest.main(verbosity=2)
  • @classmethod 是类方法,如果不熟悉的小伙伴可以翻一下之前 伊洛 写的这篇文章
    Python基础 Zero to Hero面向对象编程(二)

  • 现在运行一下并查看结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (yiluo) ➜  Code python test.py
    检验英雄关羽技能
    test_verify_skill1 (__main__.VerifySkillTestCase) ... ok
    test_verify_skill2 (__main__.VerifySkillTestCase) ... ok
    test_verify_skill3 (__main__.VerifySkillTestCase) ... ok
    英雄关羽技能校验完毕

    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s

    OK
  • 可以看到只有开始和执行了前置条件,结束后执行了一次后置条件

5.跳过测试用例
  • 实际工作测试中肯定有需要一些用例不执行,那么要如何处理
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/python3

    import unittest

    class VerifySkillTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
    print('检验英雄{}技能'.format(hero))
    def test_verify_skill1(self):
    self.assertEqual(skill1, '一骑当千')

    @unittest.skip('不校验英雄2技能')
    def test_verify_skill2(self):
    self.assertEqual(skill2, '单刀赴会')

    def test_verify_skill3(self):
    self.assertEqual(skill3, '青龙偃月')

    @classmethod
    def tearDownClass(cls):
    print('英雄{}技能校验完毕'.format(hero))

    if __name__ == '__main__':
    hero = '关羽'
    skill1 = '一骑当千'
    skill2 = '单刀赴会'
    skill3 = '青龙偃月'
    skill4 = '刀锋铁骑'
    unittest.main(verbosity=2)

    @unittest.skip(reason) 跳过被此装饰器装饰的测试。 reason 为测试被跳过的原因
    @unittest.skipIf(condition, reason) 当 condition 为真时,跳过被装饰的测试
    @unittest.skipUnless(condition, reason) 跳过被装饰的测试,除非 condition 为真
    @unittest.expectedFailure 把测试标记为预计失败。如果测试不通过,会被认为测试成功;如果测试通过了,则被认为是测试失败
    exception unittest.SkipTest(reason) 引发此异常以跳过一个测试

  • 最后来看一下运行的结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (yiluo) ➜  Code python test.py
    检验英雄关羽技能
    test_verify_skill1 (__main__.VerifySkillTestCase) ... ok
    test_verify_skill2 (__main__.VerifySkillTestCase) ... skipped '不校验英雄2技能'
    test_verify_skill3 (__main__.VerifySkillTestCase) ... ok
    英雄关羽技能校验完毕

    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s

    OK (skipped=1)
  • 结果英雄的2技能测试确实跳过了并没有执行
    6…….待续(批量执行测试用例……)
    在这里插入图片描述

    享受每一天,Just Enjoy !

关注公众号获取更多内容