Параметризация тестов с помощью pytest

Я изучаю параметризованные тесты с помощью pyest. Следуя соответствующей документации по pytest, я придумал это простой пример:

import unittest

import pytest


@pytest.fixture(autouse=True, params=['foo', 'bar'])
def foo(request):
    print('fixture')
    print(request.param)


class Foo(unittest.TestCase):
    def setUp(self):
        print('unittest setUp()')

    def test(self):
        print('test')

Это дает следующую ошибку:

Failed: The requested fixture has no parameter defined for the current test.
E               
E               Requested fixture 'foo' defined in:
E               tests/fixture.py:7

Строка 7 — def foo(request):.

Что вызывает эту ошибку и как ее исправить?


person Code-Apprentice    schedule 22.08.2017    source источник
comment
Я обычно использую @pytest.mark.parametrise('request', ['foo', 'bar']). Это не отвечает на ваш вопрос, но может работать как быстрое решение (где request - это имя аргумента)   -  person Artyer    schedule 22.08.2017
comment
@Artyer Спасибо за предложение. В документах, на которые я ссылаюсь, этого нет, поэтому мне все еще интересно узнать, что я делаю неправильно.   -  person Code-Apprentice    schedule 22.08.2017
comment
Я думаю, проблема в том, что она упоминается в ошибке, вы не определили параметр, как сказал @Artyer в своем примере, он называет запрос, а затем передает значения. В вашем коде вы передаете функции foo аргумент запроса, но в этом параметре нет параметра, который вы не определяете внутри прибора.   -  person Genaro Morales    schedule 22.08.2017
comment
@GenaroMorales Чем мой пример отличается от приведенного в документации по адресу docs .pytest.org/en/latest/fixture.html#parametrizing-fixtures?   -  person Code-Apprentice    schedule 22.08.2017
comment
Использование автоматического использования означает, что все тестовые методы в классе будут использовать эту фикстуру, если вы удалите, что вы собираетесь использовать эту фикстуру только в методе, который имеет аргумент запроса, и этот метод пройдет   -  person Genaro Morales    schedule 22.08.2017
comment
@GenaroMorales Только прибор имеет аргумент request. Метод test() не имеет аргументов (кроме self). Я хочу, чтобы фикстура применялась ко всем тестам в классе Foo. В примере есть только один тест, но потенциально их может быть больше.   -  person Code-Apprentice    schedule 22.08.2017
comment
Да, это может быть больше, но вы не определили какие-либо аргументы для других методов.   -  person Genaro Morales    schedule 22.08.2017


Ответы (1)


Цель фикстур — передать объекты тестовым примерам, но созданная вами фикстура ничего не возвращает и не дает.

Тогда я не уверен, что вы можете передавать объекты методу unittest TestCase, я думаю, это может создать некоторые конфликты с параметром self.

С другой стороны, он может работать с простой функцией:

@pytest.fixture(autouse=True, params=['foo', 'bar'])
def foo(request):
    print('fixture')
    print(request.param)
    yield request.param

# class Foo(unittest.TestCase):
#     def setUp(self):
#         print('unittest setUp()')
# 
#     def _test(self):
#         print('test')

def test_fixture(foo):
    assert foo == 'foo'

>>>  1 failed, 1 passed in 0.05 seconds
# test 1 run with foo : OK
# test 2 run with bar : FAILED

ИЗМЕНИТЬ:

Действительно: Почему модуль unittest.TestCases не видит мои приборы py.test?

person PRMoureu    schedule 22.08.2017
comment
Я переписал свои юнит-тесты в pytest. Спасибо за ссылку, которая побудила меня пойти в этом направлении. - person Code-Apprentice; 23.08.2017