【问题标题】:What happens behind `python3 -m unittest test_module.py`?`python3 -m unittest test_module.py` 后面发生了什么?
【发布时间】:2019-04-10 20:38:37
【问题描述】:

test_module.py 中,我定义了TestCase 的一个子类,由几个测试方法组成。

import unittest

class abc(unittest.TestCase):
    def test1():
      ...
    def test2():
      ...

我可以通过任一方式将测试方法作为测试用例运行

python3 -m unittest test_module.py

或添加到test_module.py

if __name__ == "__main__":
    unittest.main()

然后

python3 test_module.py

在第二种方式中,unittest.main() 在内部创建一个 TestProgram 的实例,它调用 self.runTests(),它创建一个 TextTestRunner 的实例并调用 TextTestRunner.run(),它运行并在 test_module.py 中报告所有测试结果。 Meaning of unittest.main() in Python unittest module.

在第一种方式中,python3 -m unittest test_module.py 后面的内部是否也发生了同样的事情?

【问题讨论】:

    标签: python python-unittest


    【解决方案1】:

    -m 标志告诉 Python 解释器您想使用命名模块作为要运行的主模块。如果模块在包中,这通常是运行模块的首选方式(类似python -m somepackage.somemodule 不会破坏相对导入,而python somepackage/somemodule.py 通常会这样做)。

    在这种情况下,-m unittest 标志表示运行 unittest 包本身。当你“运行”这样的包(或使用python localpackage/)时,Python 将在包中查找名为__main__.py 的文件并运行它。果然,unittest 模块有一个__main__.py 文件,您可以在Python sources 中阅读该文件。那个文件(在做了一些整理之后),几乎只是用参数module=None 调用unittest.main

    main 函数(实际上是一个类)通过查看 sys.argv 确定要测试的内容,其中包含传递给 Python 的参数(解释器尚未自行处理的参数)。在您的情况下,您在告诉 Python 运行什么的 -m unittest 标志之后向它传递了一个额外的文件名。所以test_module.py 字符串保留在sys.argv 中,unittest 代码知道加载它并检查测试。

    这与直接运行测试模块时发生的情况略有不同。当你这样做时,测试模块在解释器中被称为__main__。当您在不提供任何参数的情况下调用 unittest.main() 时,"__main__" 是默认的 module 值。因此,unittest 代码导入__main__,并检查它是否进行测试,而无需查看sys.argv(尽管它可能会在那里检查其他命令行标志)。

    【讨论】:

    • 谢谢。我的帖子中的两种方式都隐式使用TestSuite
    • 它们应该完全一样,一旦它们超过了识别包含测试的模块的点。
    • 对不起,如果我的最后评论不清楚。我看到如果不将测试用例放入测试套件就无法直接运行测试用例,但忘记了我在哪里看到的,以及它是指 python 的 unnittest 模块还是 Java 的 JUnit。见stackoverflow.com/questions/55622158/…
    • 是的,事实证明它确实会自动为您创建一个测试套件。但是我必须阅读代码才能找到它,所以也许你应该自己做,去掉中间人!以下是标准库中unittest 包的完整代码:github.com/python/cpython/tree/master/Lib/unittest
    猜你喜欢
    • 2018-07-07
    • 2021-06-06
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2019-08-24
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多