我们在做自动化测试的时候,可能会遇到一些用例中间不用回归,想要进行跳过。直接注释的话,代码量修改过大,显然这个方法不妥,哪还有什么方法?unittest这个自动化框架可以帮助我们完成这个操作
自动跳过用例
unittest中提供了一些跳过用例的装饰器方法。我们可以通过这些装饰器来帮我们完成这些操作
@unittest.skip()
表示:无条件跳过用例
def skip(reason): """ 无条件地跳过用例 """ def decorator(test_item): if not isinstance(test_item, type): @functools.wraps(test_item) def skip_wrapper(*args, **kwargs): raise SkipTest(reason) test_item = skip_wrapper test_item.__unittest_skip__ = True test_item.__unittest_skip_why__ = reason return test_item return decorator
@unittest.skipIf()
表示:如果条件为真,则跳过测试。
def skipIf(condition, reason): """ 如果条件为真,则跳过测试。 """ if condition: return skip(reason) return _id
@unittest.skipUnless()
表示:除非条件为真,否则跳过测试。
def skipUnless(condition, reason): """ 除非条件为真,否则跳过测试。 """ if not condition: return skip(reason) return _id
小试牛刀
闲话少说直接开始实战,这里我们一样使用接口完成我们的测试,当然接口文档,还是我们的查询歌曲接口(简单,免费,还好用)
# coding:utf-8 import unittest import requests class Music(unittest.TestCase): def select(self,name): url = 'https://api.apiopen.top/searchMusic' data = { "name":name } r = requests.post(url,data=data) b = r.json()['result'][0]['title'] return b @unittest.skip("强制性跳过") def test01(self): b = '断桥残雪' a = self.select(b) self.assertEqual(b,a) print("用例1跳过") @unittest.skipIf(True ,'条件为真的时候跳过') def test02(self): a = '说好不哭' b = self.select(a) self.assertEqual(a,b) print("用例2跳过") @unittest.skipUnless(False ,'条件为假的时候跳过') def test03(self): a = '芒种' c = '抖音' b = self.select(a) try: self.assertIn(c,b,msg=' 抖音不存在芒种歌曲信息中') except Exception as msg: print('错误信息%s'%msg) print("用例3跳过") def test04(self): a = '像鱼' b = self.select(a) self.assertEqual(a,b) print("用例4不跳过") if __name__ == '__main__': unittest.main(verbosity=2)
通过代码可以发现我们对用例123进行了跳过,但是每个跳过的条件不同,执行后发现只有用例4没有跳过,当然我们代码中也是只有对用例4没有跳过。
也可以从执行结果中看到我们一共跳过了3条用例,以及每条都是怎么样进行跳过的
有小伙伴们要问了,这个只是跳过单个用例,那么我想跳过一个class中的所有用例呢?这还不简单?直接把装饰器放在class上面不就可以了。
# coding:utf-8 import unittest import requests @unittest.skip('强制性跳过') class Music(unittest.TestCase): def select(self,name): url = 'https://api.apiopen.top/searchMusic' data = { "name":name } r = requests.post(url,data=data) b = r.json()['result'][0]['title'] return b def test01(self): b = '断桥残雪' a = self.select(b) self.assertEqual(b,a) print("用例1跳过") def test02(self): a = '说好不哭' b = self.select(a) self.assertEqual(a,b) print("用例2跳过") def test03(self): a = '芒种' c = '抖音' b = self.select(a) try: self.assertIn(c,b,msg=' 抖音不存在芒种歌曲信息中') except Exception as msg: print('错误信息%s'%msg) print("用例3跳过") def test04(self): a = '像鱼' b = self.select(a) self.assertEqual(a,b) print("用例4不跳过") if __name__ == '__main__': unittest.main(verbosity=2)
通过执行结果发现已经把class中的四条用例全部都跳过了。