Групування тестів в Pytest можна виконати кількома способами:

  • cтворення окремих тестових файлів (модулів)
  • cтворення класів з тестами
  • додавання маркерів до тестів

Групування тестів в окремих файлах (модулях)

Для прикладу уявімо, що в нашому додатку є функціонал авторизації та створення замовлень. Щоб згрупувати тести за функціоналом, котрий вони перевіряють, можна створити два окремих модуля: login_test.py та order_test.py:

# module login_test.py

def test_success_login():
    assert True

def test_failed_login():
    assert True
    

# module order_test.py

def test_create_order():
    assert True

def test_delete_order():
    assert True

Для запуску всіх тестів потрібно виконати команду:

pytest -v

Якщо потрібно виконати лише тести, що стосуються функціоналу авторизації (тобто окремий модуль login_test.py), слід виконати команду:

pytest login_test.py -v

Таким чином є можливість групувати тести, за допомогою створення окремих тестових модулів.

Групування тестів в класах

Інший спосіб групування тестів – створення класів з тестами. В моєму прикладі це буде два класи TestLogin та TestOrder:

# module app_test.py

class TestLogin:

    def test_success_login(self):
        assert True

    def test_failed_login(self):
        assert True

class TestOrder:

    def test_create_order(self):
        assert True

    def test_delete_order(self):
        assert True

В разі потреби виконати лише тести, що мають відношення до функціоналу авторизації (тобто клас TestLogin), слід виконати команду:

pytest app_test.py::TestLogin -v

Важливо додати, що назва тестового класу має обов’язково починатися з префікса Test, в іншому випадку pytest проігнорує клас з тестами.

Використання маркерів для тестів

Тепер уявімо кейс, коли потрібно мати групу тестів, на випадки швидкої загальної перевірки всієї функціональності додатку (наприклад smoke тести). Як виокремити групу тестів, котрі знаходяться в різних модулях/класах?

Щоб згрупувати тести, можна застосувати маркери до тестових функцій, котрі потрібно об’єднати в групі:

# module login_test.py
import pytest

@pytest.mark.smoke
def test_success_login():
    assert True

def test_failed_login():
    assert True
    

# module order_test.py
import pytest

@pytest.mark.smoke
def test_create_order():
    assert True

def test_delete_order():
    assert True

Для створення маркера використовується декоратор @pytest.mark, до якого через крапку додається ім’я (в моєму випадку smoke, але може бути іншим). Маркер @pytest.mark.smoke застосовано до двох тестів test_success_login() та test_create_order(), які знаходяться в різних модулях. Такі маркери є користувацькими (тобто вони не вбудовані в pytest), та використовуються лише для групування тестів і їх виконання.

Щоб запустити групу тестів відмічену маркером, потрібно додати опцію m та виконати команду pytest -vm <ім’я маркера>. В моєму прикладі це:

pytest -vm smoke

В результаті, було виконано лише тести помічені маркером @pytest.mark.smoke, всі інші проігноровано.

Також в результатах можна помітити попередження:

PytestUnknownMarkWarning: Unknown pytest.mark.smoke - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html

    @pytest.mark.smoke

Воно пов’язано з тим, що @pytest.mark.smoke є користувацьким маркером, і для того щоб прибрати попередження його потрібно зареєструвати. Зробити це можна в спеціальному конфігураційному файлі pytest.ini:

Додаю файл pytest.ini в кореневу директорію проекту з тестами та прописую всередині:

[pytest]
markers =
    smoke: mark test as a smoke

Запускаю тести:

Після реєстрації маркера в файлі pytest.ini, попередження зникає з результатів виконання тестів.