2017-02-18 8 views
0

Предпосылки

Я родом из Lua языка сценариев, и я имел незначительное воздействие на язык программированияJava, который я использовал для изучения алгоритмов, четвёртый редактор (ref.).Python 3, например, API и тестирование

В Java, я привык видеть один класс для каждого файла с помощью метода main() для тестирования и демонстрации правильного использования API класса.

Теперь я двигаюсь в направлении Python 3, который кажется мне смутным слиянием двух моих предыдущих миров.

Текущих настройки

Я начал разработку проекта: один главный сценария и набор папок, содержащих несколько классов (модулей Python «s). Каждый класс имеет, как я уже привык, свой собственный пример тестирования и использования, который запускает if __name__ == '__main__', i.e., если модуль запускается как сценарий (ref.).

Python 3 absolute import заявление. Теперь я в беде. Для конкретного модуля может потребоваться доступ к функции от project_root.utilis. В моей IDE (PyCharm) Я могу просто сделать from utils import blah, но это bad, потому что он выглядит firsh среди моих установленных модулей, а затем в моем текущем проекте. Кроме того, если я запускаю свой модуль с терминала, он даже не работает. я в конечном итоге SYM-увязывания функции utils/blah.py в некоторой подпапке ...

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

Вопрос

Может кто-нибудь объяснить мне, что это лучшая практика, чтобы документировать модуль с примерами испытаний, которые могут выполняться в том же файле?
Какова рекомендуемая альтернатива?

Позже результаты

Я просто понял, что в моем IDE, локальные модули имеют преимущество против установленных единиц (я считаю, что это не то, что должно произойти по умолчанию). Я не уверен, почему это происходит.
Чтобы запустить мои модули как скрипт, от project_root я могу python -m module_dir.module_name. По крайней мере, я могу удалить sym-ссылки.

ответ

1

Что такое best, по-видимому, является вопросом мнения. Итак, я собираюсь перечислить некоторые решения в моем рейтинге от худшего к лучшему.

Ввод тестов в __main__, безусловно, в одну сторону. Но вам придется самостоятельно написать структуру тестирования (например, отчетность о прошедшем и неудачном тесте).И вполне возможно, что тесты перевесят код модуля. В этом случае мне нехорошо оставить их в модуле.

Python поставляется с модулем unittest. Это порт JUnit от Java. Это довольно многословно; вы должны явно писать классы для тестов. Наверное, это стиль Java. Не очень pythonic, IMO.

Модуль doctest, который извлекает тесты из docstrings, также является частью стандартной библиотеки. Плюсом является то, что docstrings делают двойной долг; как в качестве тестов, так и в качестве примеров.

Испытательная основа pytest намного приятнее. Это будет automatically search and run many kinds of tests (включая тесты docstring). Это, конечно, мое любимое тестовое решение.

+0

Учитывая, что я за одним (или более) примером, который тестирует API и демонстрирует пользователю, как его использовать, я считаю, что * doctest *, который вы упомянули здесь, является наилучшим подходящим инструментом. Я прав? (Я также только что узнал о модификаторе '-m', чтобы временно развратить мою текущую настройку.) – Atcold

+1

Doctest кажется подходящим для вашего варианта использования. –

Смежные вопросы