Как в pytest лучше всего проверять uuid?

Рейтинг: 0Ответов: 1Опубликовано: 12.04.2023

Подскажите, пожалуйста, как лучше всего передавать значения переменных в pytest?
В коде, представленном ниже, мне потребовалось загнать значения uuid в переменные MENU_ID и SUBMENU_ID для дальнейшего использования. Для этого я использовал global, но это считается плохой практикой.
Какие лучшие практики для этого существуют в pytest?

# conftest.py

import pytest
from fastapi.testclient import TestClient

from src.main import app
from src.session import Base, engine

@pytest.fixture(scope="module", autouse=True)
def test_db():
    Base.metadata.create_all(engine)
    yield
    Base.metadata.drop_all(engine)

@pytest.fixture(scope="module")
def client():
    yield TestClient(app)


#test.py

import uuid

import pytest

class TestSubmenus:
    @pytest.fixture(scope='class', autouse=True)
    def make_menu(self, client):
        response = client.post(
            "/api/v1/menus",
            json={"title": "My menu 1",
                  "description": "My menu description 1"}
        )
        global MENU_ID
        MENU_ID = response.json()["id"]

    def test_create_submenu(self, client):
        response = client.post(
            f"/api/v1/menus/{MENU_ID}/submenus",
            json={
                "title": "My submenu 1",
                "description": "My submenu description 1"
            }
        )
        global SUBMENU_ID
        SUBMENU_ID = response.json()["id"]
        assert response.status_code == 201
        assert response.json() == {
            "id": SUBMENU_ID,
            "title": "My submenu 1",
            "description": "My submenu description 1",
            "dishes_count": 0
        }

Ответы

▲ 1Принят

В решении проблемы очень помог @insolor
Решением было вынести создание меню и подменю в фикстуры и возвращать значения id через yield.

# conftest.py   

import pytest
from fastapi.testclient import TestClient

from src.main import app
from src.session import Base, engine

@pytest.fixture(scope="module", autouse=True)
def test_db():
    Base.metadata.create_all(engine)
    yield
    Base.metadata.drop_all(engine)

@pytest.fixture(scope="module")
def client():
    yield TestClient(app)

@pytest.fixture(scope='class')
def make_menu(client):
    response = client.post(
        "/api/v1/menus",
        json={"title": "My menu 1",
              "description": "My menu description 1"}
    )
    menu_id = response.json()["id"]
    yield menu_id

@pytest.fixture(scope='class')
def make_submenu(client, make_menu):
    menu_id = make_menu
    response = client.post(
        f"/api/v1/menus/{menu_id}/submenus",
        json={"title": "My submenu 1",
              "description": "My submenu description 1"}
    )
    submenu_id = response.json()["id"]
    yield submenu_id  


# test.py   
 

class TestSubmenus:
    def test_create_submenu(self, client, 
                            make_menu, make_submenu):
        menu_id = make_menu
        submeu_id = make_submenu
        response = client.post(
            f"/api/v1/menus/{menu_id}/submenus",
            json={
                "title": "My submenu 1",
                "description": "My submenu description 1"
            }
        )
        assert response.status_code == 201
        assert response.json() == {
            "id": submeu_id,
            "title": "My submenu 1",
            "description": "My submenu description 1",
            "dishes_count": 0
        }