Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как настроить очередность фикстур в pytest?

pytest
python
Теги: #<Tag:0x00007f7b6482f078> #<Tag:0x00007f7b6482ef10>

(Bitande7) #1

Приветствую.
Такая проблема, нужно в начале тестов запускать браузер один раз, в конце всех тестов закрыть.
Но нужна отдельная фикстура, которая будет выполняться после каждой функции - удаление всех cookie.

Сейчас получается так, что в после послежнего теста срабатывает глобальная фикстура с настройкой

Scope ='session'

фикстура со

Scope ='function'

не успевает отработать и валится куча ошибок. В общем то в последнем тесте она вообще не нужна, можно ли как то настроить чтобы фикстура не срабатывала в последнем тесте?


(ex3me0) #2

Приведите пример кода, на котором фикстура scope=function будет валиться.
Похоже что проблема где-то в другом месте; фикстура - просто обертка, декоратор, который выполняет действия “до” и действия “после”

import pytest


@pytest.fixture(scope="session", autouse=True)
def sess_fixt(request):
    print("start SESSION")
    def fin():
        print("end SESSION")
    request.addfinalizer(fin)


@pytest.fixture(scope="function")
def func_fixt(request):
    print("start FUNCTION")
    def fin():
        print("end FUNCTION")
    request.addfinalizer(fin)


def test_1st(func_fixt):
    print(1)

def test_2nd(func_fixt):
    print(2)

def test_3rd(func_fixt):
    print(3)

Аутпут:

start SESSION
------------------------------
  start FUNCTION
     1
  end FUNCTION
------------------------------
  start FUNCTION
     2
  end FUNCTION
------------------------------
  start FUNCTION
     3
  end FUNCTION
------------------------------
end SESSION


#3

Вместо фикстуры можно воспользоваться хуком pytest_runtest_teardown, который будет выполняться после каждого теста.