Unittest-用例执行策略:跳过用例和预期失败

Unittest 支持跳过单个测试用例方法甚至整个测试类,用于控制测试用例的运行。

Unittest 还可以将测试标记为“预期失败expected failure”,即本来就应该失败或者随着程序版本的更新已不能正常运行的测试,标记后该用例失败也不会认为是测试结果上的失败,也就是说不会将该用例的失败计入测试结果。

跳过测试

跳过测试有两种方式可以实现,一种是使用 skip() 装饰器,装饰类或者用例,另一种是直接调用 TestCase.skipTest() 。

装饰器有三种:

  • @unittest.skip(reason)

    无条件跳过当前装饰的用例或类。reason 参数必填,用于描述跳过用例的理由。

  • @unittest.skipIf(condition, reason)

    条件 condition 参数为 True 的时候,跳过用例。reason 用于描述跳过用例的理由。

  • @unittest.skipUnless(condition, reason)
    与 skipIf() 相反。condition 参数为 False 的时候,跳过用例。reason 用于描述跳过用例的理由。

这次为了演示,将前面案例中的 4 个用例放在一个文件中,分别演示三种 skip:

import unittest
from add import add

is_smoke = False

class TestAddOne(unittest.TestCase):
    @unittest.skip('直接跳过用例演示!') # => skip
    def test_add_int(self):
        '''测试int相加'''
        result = add(5, 100)
        print('整数相加结果:', result)
        self.assertEqual(result, 105, '整数相加错误')

    @unittest.skipIf(is_smoke, '非冒烟用例,冒烟时不执行') # => skipIf
    def test_add_str(self):
        '''测试str相加'''
        result = add('5', '6')
        print('字符串相加结果:', result)
        self.assertEqual(result, '56', '字符串相加错误')

class TestAddTwo(unittest.TestCase):
    @unittest.skipUnless(is_smoke, '冒烟用例,只在冒烟时执行') # => skipUnless 
    def test_add_list(self):
        result = add(['1', '2'], ['a', 'b'])
        print('列表相加结果:', result)
        self.assertEqual(result, ['1','2','a','b'], '列表相加错误')

    def test_add_tuple(self):
        result = add((1,2), (3,4))
        print('元组相加结果:', result)
        self.assertEqual(result, (1,2,3,4), '元组相加错误')

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

is_smoke = True 时,会跳过 test_add_inttest_add_str。skip 装饰的 test_add_int 始终会跳过,test_add_str 由 skipIf 装饰,当 is_smoke 为 True 时跳过。

ss..
-------------------------------------
Ran 4 tests in 0.001s
OK (skipped=2)

列表相加结果: ['1', '2', 'a', 'b']
元组相加结果: (1, 2, 3, 4)

s 表示跳过的用例,skipped=2 跳过两个用例。

is_smoke = False 时,会跳过 test_add_inttest_add_list。skip 装饰的 test_add_int 始终会跳过,test_add_list 由 skipUnless 装饰当 is_smoke 为 False 时跳过。

s.s.
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK (skipped=2)

字符串相加结果: 56
元组相加结果: (1, 2, 3, 4)

装饰类与装饰用例类似,并且直接跳过整个类中的所有用例:

@unittest.skip('演示跳过装饰类')
class TestAddTwo(unittest.TestCase):
    pass

自己试试!

除了使用装饰器跳过外,还可以使用 TestCase.skipTest() 直接在 setUp() 方法或者用例内部跳过。

在 setUp() 中使用会跳过整个测试类。

import unittest
from add import add

is_smoke = True

class TestAddOne(unittest.TestCase):
    def setUp(self):
        if is_smoke:
            self.skipTest('直接跳过演示') # => 直接调用skipTest()
            
    def test_add_int(self):
        '''测试int相加'''
        result = add(5, 100)
        print('整数相加结果:', result)
        self.assertEqual(result, 105, '整数相加错误')

    def test_add_str(self):
        '''测试str相加'''
        if is_smoke:
            self.skipTest('非冒烟用例,冒烟时不执行') # => 在用例内调用
        result = add('5', '6')
        print('字符串相加结果:', result)
        self.assertEqual(result, '56', '字符串相加错误')
        
if __name__ == "__main__":
    unittest.main()

上面演示了在 setUp() 中使用 skipTest() 跳过整个类,在用例中使用跳过当前用例。

标记预期失败

标记预期失败,用于针对肯定会失败的用例,该用例依然会运行,只是就算未通过也不会计入失败的用例。但是如果该用例运行成功,则会标识用例失败。

我们将 TestAddTwo 中的最后一个用例标记为预期失败:

class TestAddTwo(unittest.TestCase):
    @unittest.expectedFailure # => 注意,没有括号
    def test_add_tuple(self):
        result = add((1,2), (3,4))
        print('元组相加结果:', result)
        self.assertEqual(result, (1,1,3,4), '元组相加错误')

运行后的结果为:

...x
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK (expected failures=1)

整数相加结果: 105
字符串相加结果: 56
列表相加结果: ['1', '2', 'a', 'b']
元组相加结果: (1, 2, 3, 4)

x,表示标记预期失败,三个成功,一个预期失败。test_add_tuple用例结果是故意写成失败的,但是并没有标记为失败,只是标记为 x

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容