【问题标题】:Run unittest from a Python program via a command-line option通过命令行选项从 Python 程序运行 unittest
【发布时间】:2013-05-27 15:44:52
【问题描述】:

这是我的设置 -

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

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

python prog.py --unittest

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

【问题讨论】:

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


    【解决方案1】:

    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 以获得更多高级选项。

    【讨论】:

      【解决方案2】:

      也许this 就是您要找的。在test_prog.py 中实现load_tests 函数,并在prog.py 中使用以下代码来加载和运行测试:

      import unittest
      import test.test_prog
      suite = unittest.TestLoader().loadTestsFromModule(test.test_prog)
      unittest.TextTestRunner().run(suite)
      

      【讨论】:

        【解决方案3】:

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

        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 的模块。完成后,它会加载它并创建一个包含我们要运行的 TestCases 的 TestSuite。

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


        通常,unittest 会在后台为我们完成所有这些工作,但由于我们正在尝试运行特定的测试模块,因此我们必须准确说明如何以及从何处获取它。

        另外,请注意,您必须为每个要在其中执行此操作的文件执行此操作。

        【讨论】:

          【解决方案4】:

          我刚刚删除了文件系统中项目下的.idea隐藏目录。

          我重启PyCharm,重新打开项目,这个问题就解决了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多