Запустите 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 сделает все это для нас в фоновом режиме, но поскольку мы пытаемся запустить определенный тестовый модуль, мы должны точно сказать, как и где его получить.

Также обратите внимание, что вам нужно будет сделать это для каждого файла, в который вы хотите сделать это.