在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
后面内部发生吗?你知道吗
-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
(尽管它可能会在那里检查其他命令行标志)。你知道吗相关问题 更多 >
编程相关推荐