Запустите unittest из программы Python через опцию командной строки
Вот моя настройка -
project/
__init__.py
prog.py
test/
__init__.py
test_prog.py
Я хотел бы иметь возможность запускать свои модульные тесты, вызывая параметр командной строки в prog.py, таким образом, когда я развертываю свой проект, я могу развернуть возможность запуска модульных тестов в любое время.
python prog.py --unittest
Что мне нужно в prog.py, или в остальной части моего проекта для этого?
Ответы
Ответ 1
Возможно, этот - это то, что вы ищете. Внедрите функцию load_tests
в test_prog.py
и используйте следующий код в prog.py
для загрузки и запуска тестов:
import unittest
import test.test_prog
suite = unittest.TestLoader().loadTestsFromModule(test.test_prog)
unittest.TextTestRunner().run(suite)
Ответ 2
Модуль Python unittest
содержит свою собственную функцию test discovery, которую вы можете запустить из командной строки:
$ python -m unittest discover
Чтобы запустить эту команду из своего модуля, вы можете использовать модуль subprocess
:
#!/usr/bin/env python
import sys
import subprocess
# ...
# the rest of your module code
# ...
if __name__ == '__main__':
if '--unittest' in sys.argv:
subprocess.call([sys.executable, '-m', 'unittest', 'discover'])
Если у вашего модуля есть другие параметры командной строки, вы, вероятно, захотите изучить argparse
для более сложных опций.
Ответ 3
Вы должны убедиться, что последовательно выполняете некоторые соглашения об именах (которые вы, кажется, делаете):
-
Все тесты называются с одним и тем же префиксом (test_
является нормой), а затем имя модуля, который вы хотите проверить.
prog.py
= > test_prog.py
-
Тесты находятся в каталоге test/
.
Затем вы можете сделать что-то вроде этого:
prog.py
import sys
...
... do module stuff here...
...
if __name__ == "__main__":
# Check if we want to run the tests for this file
if "--unittest" in sys.argv:
import unittest
test_filename = 'test_' + __file__
test_directory = 'test'
suite = unittest.TestLoader().discover(test_directory, pattern=test_filename)
unittest.TextTestRunner(verbosity=2).run(suite)
Что мы делаем, это:
-
Проверка аргументов команды, чтобы увидеть, присутствует ли --unittest
(так как это единственный раз, когда вы хотите запустить тесты).
-
Если это так, мы создаем test_prog.py
- в соответствии с соглашениями об именах, которые мы установили.
-
Затем мы передаем это функции TestLoader().discover
.
открыть (...) начинается с указанной директории и находит все тестовые модули (рекурсивные в подкаталоги), которые соответствуют предоставленному шаблону.
В нашем случае он будет выглядеть внутри каталога test/
для любого модуля с именем test_prog.py
. Когда он это делает, он загружает его и создает TestSuite с TestCases, которые мы хотим запустить.
-
Наконец, мы вручную протестируем unittest
для запуска suite
, полученного на предыдущем шаге.
Обычно unittest
сделает все это для нас в фоновом режиме, но поскольку мы пытаемся запустить определенный тестовый модуль, мы должны точно сказать, как и где его получить.
Также обратите внимание, что вам нужно будет сделать это для каждого файла, в который вы хотите сделать это.