{python3 -m unittest test_module.py`

时间:2019-04-10 20:38:38

标签: python python-unittest

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中的所有测试结果。 https://stackoverflow.com/a/20993280/156458

第一种方法是在python3 -m unittest test_module.py后面内部发生相同的事情吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

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

在这种情况下,-m unittest标志表示要运行unittest包本身。当您“运行”这样的程序包(或使用python localpackage/)时,Python将在名为__main__.py的程序包中查找文件,然后运行该文件。确实,unittest模块具有一个__main__.py文件,您可以在Python sources中读取该文件。该文件(做完一些内务处理后)几乎只用参数unittest.main调用module=None

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

这与直接运行测试模块时发生的情况有些不同。执行此操作时,测试模块在解释器内部称为__main__。在不提供任何参数的情况下调用unittest.main()时,"__main__"是默认的module值。因此,单元测试代码将导入__main__,并对其进行测试以进行测试,而无需查看sys.argv(尽管可以在此处检查其他命令行标志)。