禁用pytest固定装置

时间:2018-12-02 10:26:16

标签: python python-3.x pytest fixtures disable

是否可以在pytest中禁用固定装置?

我要这样做的原因是,我正在使用自己的夹具框架,目前是这样的(不同夹具机制的优缺点不是此问题的重点):

import functools

def with_fixtures(test_func):
    @functools.wraps(test_func)
    def wrapper(self, *args, **kwargs):
        # This simplified code reproduces the problem -- the real implementation passes
        # an object instead of a dummy
        return test_func(self, "dummy fixtures", *args, **kwargs)
    return wrapper

class Test:
    @with_fixtures
    def test(self, fixtures):
        print("fixtures %s" % (fixtures, ))
        pass

如果我在另一个框架上运行该测试,则我的with_fixtures装饰器会将一个夹具对象传递给该测试。如果我在上面运行pytest,我会得到:

def test(self, fixtures):
E       fixture 'fixtures' not found

为了禁用pytest固定装置,我宁愿在本地用装饰器标记单个测试,而不是将代码添加到我的测试没有显式依赖项的特殊文件(如conftest.py)中,因此在本地更容易查看为什么测试表现如此?

2 个答案:

答案 0 :(得分:0)

如果要对pytest隐藏参数,请使用funcsigs / inspect中的签名对象,告诉pytest函数没有参数

或者有自己的不使用治具系统的测试项目

pytest当前不支持替换治具系统,因此您必须与之抗争

答案 1 :(得分:0)

PyTest 使用 inspect.signature,它可以被 __signature__ 覆盖。要从签名中删除一个参数,一个简单的方法是获取

的签名
  • functools.partial(func, None)(使用第一个位置参数)或
  • functools.partial(func, kw=None)(使用关键字参数 kw)。
def with_fixtures(test_func):
    @functools.wraps(test_func)
    def wrapper(self, *args, **kwargs):
        # This simplified code reproduces the problem -- the real implementation passes
        # an object instead of a dummy
        return test_func(self, "dummy fixtures", *args, **kwargs)
    wrapper.__signature__ = inspect.signature(functools.partial(test_func, None))
    return wrapper

请参阅 https://github.com/cupy/cupy/pull/4192/files#diff-0325229b89e681b528114e65b1f5a3369be70bb4fbcbb441a9a1bdd7de60be51 了解真实示例。