Запустите 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 для более продвинутых вариантов.

Вы должны убедиться, что вы последовательно следуете некоторым соглашениям об именах (что вы, похоже, делаете):

  1. Все тесты имеют одинаковый префикс (test_ является нормой), после чего следует название модуля, который вы хотите проверить.

    prog.py => test_prog.py

  2. Тесты находятся в 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, повторно открыл проект, и эта проблема была решена.

Другие вопросы по тегам