unittest-06-跳过测试与预期失败

Unittest 支持跳过单个或整组的测试用例。它还支持把测试标注成“预期失败”的测试。

1. 跳过测试

在测试过程中可能由于某些因素(如该方法尚存问题、暂未完成、受外部环境制约等)需要跳过一些测试的执行,一般有两种途径用于跳过测试:

  • 通过装饰器
  • 通过显示调用 skipTest(reason) 方法

1.1. 跳过指定方法

跳过测试可以使用的装饰器【 @unittest.skipxxx() 】:

跳过测试方法举例:

  • 方法 test_02:通过装饰器,无条件跳过
  • 方法 test_03、test_04:通过装饰器,以条件判断是否跳过
  • 方法 test_05:在方法逻辑内显示调用 skipTest() 跳过测试
import unittest
import requests
from unittest import skip, skipIf, skipUnless


class TestLab(unittest.TestCase):

    def test_01(self):
        self.assertEqual(1, 1)

    @skip("无条件跳过该测试方法")
    def test_02(self):
        self.assertEqual(2, 2)

    @skipIf(requests.__version__ > "2",
            f"request模块当前版本为:{requests.__version__},如果版本大于2则跳过")
    def test_03(self):
        self.assertEqual(3, 3)

    @skipUnless(requests.__version__ < "2",
                f"request模块当前版本为:{requests.__version__},如果版本不小于2则跳过")
    def test_04(self):
        self.assertEqual(4, 4)

    # 在方法内部通过显示调用 skipTest() 方法,跳过当前测试
    def test_05(self):
        if not hasattr(unittest, "__version__"):
            self.skipTest("属性访问异常,unittest没有__version__这个属性,跳过该测试")


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

输出结果,方法02~05 均被跳过:

 

1.2. 跳过测试时会一并跳过测试固件

注意,跳过测试时与测试固件相关,如果某测试被跳过,则其相应的 setUp 和 tearDown 方法将随着不被调用:

  • 被跳过的测试的 setUp() 和 tearDown() 不会被运行。
  • 被跳过的类的 setUpClass() 和 tearDownClass() 不会被运行。
  • 被跳过的模组的 setUpModule() 和 tearDownModule() 不会被运行。

举例:setUp 方法随测试方法一并被跳过

import unittest
from unittest import skip


class TestLab(unittest.TestCase):
    def setUp(self) -> None:
        print("为各方法进行初始化操作!")

    def test_01(self):
        print("当前测试方法:test_01")
        self.assertEqual(1, 1)

    @skip("无条件跳过该测试方法")
    def test_02(self):
        print("当前测试方法:test_02")
        self.assertEqual(2, 2)


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

执行测试结果:可见 test_02 方法被跳过执行,而且也没有为其执行 setUp 操作

 

1.3. 由于 setUp 中的异常而主动跳过

另外,在 setUp() 中也可以主动跳过测试。用于初始化时,所需资源不可用的情况下,跳过接下来的所有测试。

在实际应用中当你的测试依赖于外部资源时,如需要访问数据库,但数据库无法正确建立连接,那么在setUp()中你可以捕获这个异常并跳过测试,而不是让接下来整个测试失败,继而浪费了不必要的时长。

以下案例在 setUp 方法中模拟产生了异常情况,并在异常处理中使用 skipTest() 方法跳过测试,从输出结果可见,后续的测试方法也被一并跳过了。

import unittest


class TestLab(unittest.TestCase):
    # 模拟异常产生
    def setUp(self) -> None:
        try:
            x = 1 / 0
        except ZeroDivisionError:
            # 主动跳过当前方法
            self.skipTest("由于初始化时产生了异常,需要跳过下面所有的测试")

    # 该测试方法将被跳过
    def test_01(self):
        self.assertEqual(1, 1)


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

输出结果:

 

1.4. 跳过整个类

为类上添加跳过装饰器,可以跳过该类中所有方法的执行。

import unittest


@unittest.skip("该用例被无条件跳过")
class TestLabA(unittest.TestCase):

    def test_01(self):
        self.assertEqual(1, 1)

    def test_02(self):
        self.assertEqual(1, 1)


class TestLabB(unittest.TestCase):

    def test_03(self):
        self.assertEqual(1, 1)


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

 

2. 预期测试失败

将测试标记为预期的失败或错误。 如果测试失败或在测试函数自身(而非在某个 test fixture 方法)中出现错误则将认为是测试成功。 如果测试通过,则将认为是测试失败。

通过使用 @unittest.expectedFailure 装饰器,可以预期测试将会失败,且不会输出跟踪信息。

举例如下:

  • test_01 方法:断言成功,测试成功。 结果输出:未预期成功(unexpected success)
  • test_02 方法:断言失败,导致测试失败。结果输出:预期失败(expected failure)
  • test_03 方法:执行逻辑产生异常,导致测试失败。输出结果:预期失败(expected failure)

import unittest


class TestLab(unittest.TestCase):
    @unittest.expectedFailure
    def test_01(self):
        self.assertEqual(1, 1)

    @unittest.expectedFailure
    def test_02(self):
        self.assertEqual(1, 4)

    @unittest.expectedFailure
    def test_03(self):
        x = 1 / 0


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值