Групування тестів в 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, попередження зникає з результатів виконання тестів.