Изучение различных методов организации и запуска тестов pytest в подпапках

В этой статье блога мы рассмотрим различные методы организации и запуска тестов pytest, которые хранятся в подпапках. Логическая и структурированная организация тестов может значительно повысить удобство сопровождения и читабельность вашего набора тестов. Мы рассмотрим различные подходы и примеры кода, которые помогут вам эффективно управлять тестами pytest во вложенных папках.

Методы:

  1. Использование команды pytest.
    Один из самых простых способов запуска тестов pytest во вложенных папках — использование команды pytestс путь к подпапке. Например, чтобы запустить тесты в подпапке с именем «tests», вы можете использовать следующую команду:

    pytest tests/
  2. Использование хука pytest_collection_modifyitems.
    Вы можете использовать хук pytest_collection_modifyitemsдля динамического изменения коллекции тестовых элементов перед их запуском. Это позволяет вам настроить способ обнаружения и организации тестов pytest в подпапках. Вот пример использования хука в файле conftest.py:

    # conftest.py
    import pytest
    import os
    def pytest_collection_modifyitems(config, items):
    for item in items:
        if os.path.dirname(item.nodeid).startswith("tests/"):
            item.add_marker(pytest.mark.subfolder)

    Затем вы можете использовать маркер @pytest.mark.subfolderдля выбора и запуска тестов в нужных подпапках.

  3. Использование файла конфигурации pytest.ini.
    Другой подход — использовать файл конфигурации pytest.iniдля указания подпапок, в которых расположены тесты. Создайте файл pytest.iniв корневом каталоге вашего проекта и добавьте следующие строки:

    [pytest]
    testpaths = tests

    Эта конфигурация предписывает pytest искать тесты в подпапке «tests».

  4. Использование Python unittestTest Discovery.
    Если ваши тесты написаны с использованием платформы unittest, вы можете использовать ее встроенный механизм обнаружения тестов. Создайте файл с именем __init__.pyв каждой подпапке, содержащей тесты, а затем используйте следующую команду для запуска тестов:

    python -m unittest discover -s tests

    Эта команда рекурсивно обнаруживает и запускает все тесты в подпапке «tests».

  5. Использование обнаружения пользовательских тестов.
    Если ни один из вышеперечисленных методов не соответствует вашим потребностям, вы можете реализовать логику обнаружения пользовательских тестов с помощью Python osи importlib. модули. Вот пример пользовательской функции обнаружения тестов:

    import os
    import importlib
    def discover_tests(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.startswith("test_") and file.endswith(".py"):
                module_name = file[:-3]
                module_path = os.path.join(root, file)
                module = importlib.import_module(module_name)
                yield module
    # Usage
    for test_module in discover_tests("tests"):
    # Run tests from the discovered modules
    ...