Python 如果属性I';我之前评估过isn';这不是真的吗?
我正在用Python编写一个测试用例,看起来像这样:Python 如果属性I';我之前评估过isn';这不是真的吗?,python,unit-testing,Python,Unit Testing,我正在用Python编写一个测试用例,看起来像这样: class MyTestCase(unittest.TestCase): def setUp(self): # ... check if I'm online - might result in True or False self.isOnline = True @unittest.skipIf(not self.isOnline, "Not online") def test_xyz(self): #
class MyTestCase(unittest.TestCase):
def setUp(self):
# ... check if I'm online - might result in True or False
self.isOnline = True
@unittest.skipIf(not self.isOnline, "Not online")
def test_xyz(self):
# do a test that relies on being online
@skipIfTrue('isOnline')
def test_thing(self):
print("A test")
但是,我认为这似乎不起作用,因为
@skipIf
不能在函数声明体之外使用self
。我知道我可以在test_xyz
函数中检查self.isOnline
的值,并使用skipTest
,但这样做不太优雅。还有其他选项吗?如果您可以将isOnline
测试移到设置方法之外,那么这就是一个解决方案:
IS_ONLINE = i_am_online()
class MyTestCase(unittest.TestCase):
@unittest.skipUnless(IS_ONLINE, "Not online")
def test_xyz(self):
# do a test that relies on being online
另一个(更优雅的选择)是:
import unittest
def skipWhenOffline():
if not i_am_online():
return unittest.skip("Not online")
return unittest._id
class MyTestCase(unittest.TestCase):
@unittest.skipWhenOffline()
def test_xyz(self):
# do a test that relies on being online
但是,如果您无法做到这一点,那么没有比使用skipTest()
更优雅的解决方案了
skipIf
和skipUnless
在类声明时进行评估(它们在方法上设置了\uuuuuuu unittest\u skip\uuuuu
属性,以指示它不应该运行,稍后在运行测试之前查看)。您的设置
方法当时还没有运行。您可以编写自己的装饰器,将标志名称传递给它:
def skipIfTrue(flag):
def deco(f):
def wrapper(self, *args, **kwargs):
if getattr(self, flag):
self.skipTest()
else:
f(self, *args, **kwargs)
return wrapper
return deco
然后在您的类中,您将定义如下的测试方法:
class MyTestCase(unittest.TestCase):
def setUp(self):
# ... check if I'm online - might result in True or False
self.isOnline = True
@unittest.skipIf(not self.isOnline, "Not online")
def test_xyz(self):
# do a test that relies on being online
@skipIfTrue('isOnline')
def test_thing(self):
print("A test")
这是否比只签入方法好取决于具体情况。如果您使用多种方法执行此操作,则可能比在每种方法中都写入支票要好。另一方面,如果您正在这样做,您可能希望将它们组合在一起,并进行一次检查以跳过整个套件。我想补充一点,如果您使用的是nosetests
,则需要使用@wrapps
来装饰包装器
函数。如果没有这一点,测试函数在技术上将是包装器
,而nosetests
不会调用它,因为默认测试方法需要从测试开始
from unittest2.compatibility import wraps
def skipIfTrue(flag):
def deco(f):
@wraps(f)
def wrapper(self, *args, **kwargs):
if getattr(self, flag):
self.skipTest()
else:
f(self, *args, **kwargs)
return wrapper
return deco
这里的所有其他答案都可以,但它们或多或少都是黑客和/或需要第三方解决方案
最好还是按照老派的方法,将if条件:self.skipTest()
作为测试函数的第一行
def测试xyz(自身):
如果不是self.isOnline:
self.skipTest(“非在线”)
##如果你愿意,你甚至可以把它写成一行
#如果不是self.isOnline:self.skipTest(“非在线”)
##正好和装饰师的长度一样长,
##因此,即使从方便的角度来看,它也与decorator大致相同
#@unittest.skipIf(非self.isOnline,“非在线”)
你是否测试你是否依赖在线(…)
在内部使用skipTest
并没有那么糟糕。谢谢。我认为这比这里的另一个解决方案稍微优雅一点,所以标记这一点是可以接受的。但两者都很好。