1

是否可以在 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装饰器会将一个fixtures 对象传递给测试。如果我对此运行 pytest,我会得到:

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

为了禁用 pytest 固定装置,我宁愿在本地使用装饰器标记单个测试,也不愿将代码添加到conftest.py我的测试没有显式依赖的特殊文件中,这样就更容易在本地查看为什么测试的行为如此。

4

2 回答 2

0

如果你想对 pytest 隐藏你的参数,请使用来自 funcsigs/inspect 的签名对象,它告诉 pytest 函数没有参数

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

pytest目前不支持更换fixture系统,所以你将不得不与之抗争

于 2018-12-03T11:56:42.343 回答
0

PyTest uses inspect.signature, which can be overwritten by __signature__. To remove an argument from the signature, an easy way is to get the signature of

  • functools.partial(func, None) (consumes the first positional argument) or
  • functools.partial(func, kw=None) (consumes keyword argument 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

See https://github.com/cupy/cupy/pull/4192/files#diff-0325229b89e681b528114e65b1f5a3369be70bb4fbcbb441a9a1bdd7de60be51 for a real-world example.

于 2021-08-05T00:57:12.743 回答