6

我正在尝试在类 skipif 装饰器中使用 pytest 固定装置(范围 = 模块),但我收到一条错误消息,指出未定义固定装置。这可能吗?

conftest.py 有一个名为“target”的带有模块范围的夹具,它返回一个 CurrentTarget 对象。CurrentTarget 对象有一个函数 isCommandSupported。test_mytest.py 有一个包含十几个测试函数的类 Test_MyTestClass。我想根据夹具 target.isCommandSupported 跳过 Test_MyTestClass 中的所有测试,所以我用 skipif 装饰 Test_MyTestClass ,例如:

@pytest.mark.skipif(not target.isCommandSupprted('commandA), reason=command not supported')
class Test_MyTestClass:
...

我收到此错误: NameError: name 'target' is not defined

如果我尝试:

@pytest.mark.skipif(not pytest.config.getvalue('tgt').isCommandSupprted('commandA), reason=command not supported')
class Test_MyTestClass:
...

我收到此错误: AttributeError: 'function' object has no attribute 'isCommandSupprted'

4

2 回答 2

7

在第一种情况下出现错误的原因是 pytest 注入了固定装置,因此它们通过函数参数在您的测试函数中可用。它们永远不会被导入更高的范围。

你得到 AttributeError 的原因是固定装置是函数,并且在第一次(或每次)使用时被评估。因此,当您通过它时,pytest.config它仍然是一个功能。这与其他答案将失败的原因相同 - 如果您导入它,您正在导入夹具功能,而不是它的结果。

没有直接的方法可以做你想做的事,但你可以用一个额外的夹具来解决它:

@pytest.fixture(scope='module')
def check_unsupported(target):
  if not target.isCommandSupported('commandA'):
    pytest.skip('command not supported')

@pytest.mark.usefixtures('check_unsupported')
def test_one():
  pass

def test_two(check_unsupported):
  pass
于 2018-04-18T00:43:03.407 回答
1

您可以target像这样从 conftest 导入:

from conftest import target

然后,您可以pytest.mark.skipif按照您在示例中的意图使用它。

@pytest.mark.skipif(not target.isCommandSupported('commandA'), reason='command not supported')
def Test_MyTestClass:

如果您需要pytest.mark.skipif在多个测试中重复相同的逻辑并希望避免复制粘贴,那么一个简单的装饰器将有所帮助:

check_unsupported = pytest.mark.skipif(not target.isCommandSupported('commandA'),
                                       reason='command not supported')

@check_unsupported
def test_one():
    pass

@check_unsupported
def test_two():
    pass
于 2016-09-01T18:42:36.387 回答