Отключить приборы 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 для реального примера.

Другие вопросы по тегам