Как проверить файл автономного скрипта - PullRequest
0 голосов
/ 02 июля 2018

Я написал модуль для установки через pip со структурой dir, такой как:

bin/myapp
src/mymodule
src/mymodule/__init__.py
src/mymodule/config.py
src/mymodule/file1.py
src/mymodule/file2.py
tests/func/
tests/unit/file1/test_func1.py
tests/unit/file1/test_func2.py
tests/unit/file2/test_func1.py
setup.py
setup.cfg

setup.py содержит:

scripts=['bin/myapp'],

myapp импортирует mymodule и является скриптом-оболочкой, который выполняет код модуля по мере необходимости. например myapp содержит:

import mymodule

def main(config_file):
    mymodule.read_config(config_file)
    ...
    mymodule.do_something_else
    ...

if __name__ == '__main__':
    ...
    main(config_file)

Я хочу написать тест в 'func /' (func / test_myapp.py), который настроит структуру каталогов, а затем выполнит "myapp", который вызывает мой модуль для сквозного теста (мне нужно будет подделать некоторые функции, поскольку они вызывают реальные исполняемые файлы, которые не существуют на тестовой машине).

Но я не могу найти хорошую статью, в которой рассказывается, как импортировать bin / myapp, чтобы его можно было протестировать.

Любая помощь приветствуется.

P.S. Пример кода должен быть совместим с 2.7 и 3.x, поэтому оба тега помечены.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вместо ввода логики в bin/myapp, поместите одну или несколько функций в mymodule/cli.py и используйте точку входа: https://packaging.python.org/specifications/entry-points/

Вы сведете к минимуму шаблон, который вы пишете, и логика будет импортируемой в ваших тестах и ​​для всех, кто устанавливает пакет - вам может быть удобнее вызывать функцию напрямую в некоторых случаях, чем shell, если вы хотите больше явный контроль в других клиентах.

Ваш точный вопрос тестирования также рассматривается здесь: http://python -packaging.readthedocs.io / en / latest / command-line-scripts.html # the-console-scripts-entry-point

0 голосов
/ 02 июля 2018

Один из способов сделать это может быть subprocess корзина в тесте, а затем проверить каждый ожидаемый элемент после того, как корзина будет выполнена. так как в test_func1.py

что-то вроде

import subprocess
def test1():
    stdout = subprocess.check_output(['bin/myapp'])
    assert os.listdir('./newfolder') == ['blah1', 'blah2']
    assert stdout == '''some expected output'''
Преимущество

в том, что он ближе к интеграционному тесту, но и в том, что он ближе к тесту интеграции, поэтому может потребоваться очистить его после тестирования.

или вы можете:

def test1():
    from myapp import main
    assert main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...