Запустите unittest из программы Python через опцию командной строки
Вот мой набор -
project/
__init__.py
prog.py
test/
__init__.py
test_prog.py
Я хотел бы иметь возможность запускать свои модульные тесты, вызывая параметр командной строки в prog.py, таким образом, когда я развертываю свой проект, я могу развернуть возможность запуска модульных тестов в любое время.
python prog.py --unittest
Что мне нужно в prog.py или в остальной части моего проекта, чтобы это работало?
3 ответа
Возможно, это то, что вы ищете. Реализовать load_tests
функция в test_prog.py
и используйте следующий код в prog.py
загрузить и запустить тесты:
import unittest
import test.test_prog
suite = unittest.TestLoader().loadTestsFromModule(test.test_prog)
unittest.TextTestRunner().run(suite)
Питон unittest
Модуль содержит собственную функцию обнаружения тестов, которую вы можете запустить из командной строки:
$ python -m unittest discover
Чтобы запустить эту команду из вашего модуля, вы можете использовать subprocess
модуль:
#!/usr/bin/env python
import sys
import subprocess
# ...
# the rest of your module's code
# ...
if __name__ == '__main__':
if '--unittest' in sys.argv:
subprocess.call([sys.executable, '-m', 'unittest', 'discover'])
Если у вашего модуля есть другие параметры командной строки, вы, вероятно, захотите посмотреть argparse
для более продвинутых вариантов.
Вы должны убедиться, что вы последовательно следуете некоторым соглашениям об именах (что вы, похоже, делаете):
Все тесты имеют одинаковый префикс (
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
функция.Discover (...) запускается в указанном каталоге и находит все тестовые модули (возвращающиеся в подкаталоги), которые соответствуют предоставленному шаблону.
В нашем случае это будет выглядеть внутри
test/
каталог для любого модуля с именемtest_prog.py
, Когда это происходит, он загружает его и создает TestSuite с TestCases, которые мы хотим запустить.Наконец, мы вручную тестируем
unittest
запуститьsuite
полученный на предыдущем шаге.
Обычно, unittest
сделаем все это для нас в фоновом режиме, но так как мы пытаемся запустить определенный тестовый модуль, мы должны точно сказать, как и где его получить.
Также обратите внимание, что вам придется делать это для каждого файла, в котором вы хотите сделать это.
Я только что удалил
.idea
скрытый каталог под проектом в файловой системе. Перезапустил Pycharm, повторно открыл проект, и эта проблема была решена.