исключение pytest ни один тип объекта не вызывается

В test1.py у меня есть код ниже

@pytest.fixture(scope="session")
def moduleSetup(request):
    module_setup = Module_Setup()
    request.addfinalizer(module_setup.teardown())
    return module_setup

def test_1(moduleSetup):
    print moduleSetup
    print '...'
    #assert 0

# def test_2(moduleSetup):
#     print moduleSetup
#     print '...'
#     #assert 0

И в conftest.py у меня есть

class Module_Setup:
    def __init__(self):
        self.driver = webdriver.Firefox()

    def teardown(self):
        self.driver.close()

Когда я запускаю, он запускает и закрывает браузер.

Но я также получаю сообщение об ошибке self = <CallInfo when='teardown' exception: 'NoneType' object is not callable>, func = <function <lambda> at 0x104580488>, when = 'teardown'

Также, если я хочу запустить оба теста test_1 и test_2 с тем же объектом драйвера, мне нужно использовать область module или session

4 голоса | спросил user2661518 3 Maypm16 2016, 19:28:35

1 ответ


0

Об исключении

При использовании request.addfinalizer() вы должны передать ссылку на функцию.

Ваш код передает результат вызова этой функции.

request.addfinalizer(module_setup.teardown())

Вы должны называть это так:

request.addfinalizer(module_setup.teardown)

Относительно области применения прибора

Если ваш прибор позволяет повторно использовать несколько тестовых вызовов, используйте "session" объем. Если это позволяет повторное использование только для тестов в одном модуле, используйте "module" scope.

Альтернативное решение для крепления

То, как вы используете приборы, не очень похоже на стиль pytest, скорее напоминает unittest.

Из кода, который вы показываете, кажется, единственное, что вам нужно, - это запустить Firefox с драйвером, позволяющим использовать его в своих тестах, а после этого вам нужно его закрыть.

Это может быть достигнуто одним прибором:

@pytest.fixture(scope="session")
def firefox(request):
    driver = webdriver.Firefox()
    def fin():
        driver.close()
    request.addfinalizer(fin)

или даже лучше, используя @pytest.yield_fixture

@pytest.yield_fixture(scope="session")
def firefox(request):
    driver = webdriver.Firefox()
    yield driver
    driver.close()

yield - это место, где останавливается выполнение прибора и возвращает созданное значение (драйвер) для тестирования.

После того, как тесты закончились (или лучше, когда закончится область применения нашего прибора), он продолжает выполнение инструкций после yield и выполняет очистку работа.

Во всех случаях вы можете изменить свои тестовые примеры следующим образом:

def test_1(firefox):
    print moduleSetup
    print '...'

и устройство moduleSetup полностью устареет.

ответил Jan Vlcinsky 3 Maypm16 2016, 19:40:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132