Модульное тестирование Python; Разрушение импорта - PullRequest
0 голосов
/ 23 января 2019

У меня есть приложение на Python, которое я пытаюсь выполнить модульное тестирование.Код находится в каталоге src, тесты - в каталоге тестов.

Проблема возникает при попытке протестировать класс, содержащий мой метод main.Этот класс находится в каталоге src и имеет ссылки на классы в других модулях, которые все находятся в каталоге src.Чтобы выполнить мое приложение, у меня есть ссылки в этом формате from <module> import <class>

Когда я прихожу тестировать этот основной класс, я пишу тестовый класс и помещаю его в тестовый каталог.Запустив тест, я обнаружил, что у меня проблемы с импортом в основной класс.Чтобы решить, я должен изменить импорт на from src.<module> import <class>. После этого мои тесты теперь проходят, но само приложение не проходит.

Как я могу решить проблему, чтобы мой импорт действовал для обоих моих модульных тестов?а нормальное исполнение?

1 Ответ

0 голосов
/ 23 января 2019

Может произойти сбой из-за способа работы import.

Я бы рекомендовал всегда использовать абсолютный импорт.Это означает, что при создании пакета весь импорт в этом пакете импортируется полностью с верхнего уровня вниз: from package.module import thing.И что еще более важно, установка вашего пакета - не как обычного пакета Python, а с символической ссылкой позволяет редактировать исходный код, пока он все еще считается установленным пакетом.Таким образом, вы можете расположить свои тесты и сценарии так, как вы хотите, и все будет работать всегда.

Установка вашего пакета выполняется с помощью pip install -e . из root.См. учебник по упаковке для примера упаковки, если вы с ней не знакомы.

Пример структуры пакета может быть:

root/
    setup.py
    MANIFEST.in
    ...
    package/
        __init__.py
        app.py
        tests.py
        module/
            __init__.py
            component.py
            module_test.py

    # Or have a tests folder under root
    tests/
        test_module.py
        tests.py

И, например, вapp.py, и везде на самом деле:

from package.module.component import Class
from package.module import thing   # that was declared in module/__init__.py

Так что для вашего случая, если я правильно понял, вы бы получили:

root/
    setup.py
    MANIFEST.in
    ...
    src/
        __init__.py
        app.py
        module.py
    tests/
        test_module.py
        tests.py
...