python3 m unittest后面发生了什么_模块.py`

2024-04-23 07:36:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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后面内部发生吗?你知道吗


Tags: 实例pytestimport定义maindef方式
1条回答
网友
1楼 · 发布于 2024-04-23 07:36:26

-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的参数(解释器本身还没有处理的参数)。在您的例子中,您将在-m unittest标志之后向它传递一个额外的文件名,该标志告诉Python要运行什么。因此test_module.py字符串仍保留在sys.argv中,unittest代码知道如何加载它并检查测试。你知道吗

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

相关问题 更多 >