通过命令行选项从Python程序运行unittest

RyP*_*eck 19 python unit-testing software-packaging python-2.7

这是我的设置 -

project/
    __init__.py
    prog.py
    test/
        __init__.py
        test_prog.py
Run Code Online (Sandbox Code Playgroud)

我希望能够通过在prog.py中调用命令行选项来运行我的单元测试,这样当我部署项目时,我可以随时部署运行单元测试的能力.

python prog.py --unittest
Run Code Online (Sandbox Code Playgroud)

在prog.py或我的项目的其余部分中我需要什么才能工作?

Jac*_*ing 48

Python unittest模块包含自己的测试发现功能,您可以从命令行运行该功能:

$ python -m unittest discover
Run Code Online (Sandbox Code Playgroud)

要从模块中运行此命令,可以使用以下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'])
Run Code Online (Sandbox Code Playgroud)

如果您的模块有其他命令行选项,您可能需要查看argparse更高级的选项.


ami*_*des 13

也许就是你要找的东西.实现一个load_tests函数test_prog.py并使用以下代码prog.py来加载和运行测试:

import unittest
import test.test_prog
suite = unittest.TestLoader().loadTestsFromModule(test.test_prog)
unittest.TextTestRunner().run(suite)
Run Code Online (Sandbox Code Playgroud)


Car*_*s V 11

您必须确保始终遵循某些命名约定(您似乎正在执行此操作):

  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)
Run Code Online (Sandbox Code Playgroud)

我们正在做的是:

  • 检查命令参数以查看是否--unittest存在(因为这是您唯一要运行测试的时间).

  • 如果是,那么我们创建test_prog.py- 遵循我们设置的命名约定.

  • 然后我们将它传递给TestLoader().discover函数.

    discover(...)从指定的目录开始,找到与提供的模式匹配的所有测试模块(递归到子目录).

    在我们的例子中,它将在test/目录中查找任何名为的模块test_prog.py.如果是这样,它会加载它并使用我们想要运行的TestCases创建一个TestSuite.

  • 最后,我们手动测试unittest以运行suite上一步中获得的.


通常情况下,unittest我们会在后台为我们完成所有这些工作,但由于我们正在尝试运行特定的测试模块,因此我们必须确切地告诉您如何以及从何处获取它.

另请注意,您必须为要执行此操作的每个文件执行此操作.