Отключить приборы Pytest
Можно ли отключить светильники в 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 ответа
Если вы хотите скрыть свои аргументы от pytest, используйте объекты подписи из funcsigs/inspect, которые сообщают pytest, что у функции нет аргументов
в качестве альтернативы есть собственные тестовые элементы, которые не используют систему крепления
В настоящее время pytest не поддерживает замену системы приборов, поэтому вам придется с ней бороться
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 для реального примера.