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

时间:2013-05-31 18:39:37

标签: python unit-testing python-2.7 software-packaging

这是我的设置 -

project/
    __init__.py
    prog.py
    test/
        __init__.py
        test_prog.py

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

python prog.py --unittest

我需要在prog.py或项目的其余部分中进行此操作吗?

4 个答案:

答案 0 :(得分:42)

Python unittest模块包含自己的test discovery函数,您可以从命令行运行该函数:

$ 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 :(得分:9)

或许this正是您所寻找的。在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 :(得分:9)

您必须确保始终遵循一些命名约定(您似乎正在做):

  1. 所有测试都以相同的前缀命名(test_是常态),后跟您要测试的模块的名称。

    prog.py => test_prog.py

  2. 测试位于test/目录。

  3. 然后你可以这样做:

    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的任何模块。如果是这样,它会加载它并使用我们想要运行的TestCases创建一个TestSuite。

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


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

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

答案 3 :(得分:0)

我刚刚删除了文件系统中项目下的.idea隐藏目录。 重新启动Pycharm,重新打开项目,此问题已解决。