Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果属性I';我之前评估过isn';这不是真的吗?_Python_Unit Testing - Fatal编程技术网

Python 如果属性I';我之前评估过isn';这不是真的吗?

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): #

我正在用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):
    # 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
并没有那么糟糕。谢谢。我认为这比这里的另一个解决方案稍微优雅一点,所以标记这一点是可以接受的。但两者都很好。