在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
后面内部发生相同的事情吗?
谢谢。
答案 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
(尽管可以在此处检查其他命令行标志)。