为什么PyCharm中不加if __name__ == '__main__'时unittest测试无法识别
问题原理详解
1. 为什么你直接运行testing.py,__name__却不是__main__
PyCharm默认识别到你写的是unittest测试用例时,会自动使用内置的unittest执行器运行脚本,而非直接把testing.py作为入口程序执行:
- 执行入口是PyCharm自带的
_jb_unittest_runner.py脚本(你运行日志里的路径可以看到),本质等价于执行python -m unittest 你的测试文件路径 - 执行器会先以模块导入的方式加载testing.py,此时testing.py的全局变量
__name__自然为模块名testing,而非入口程序的__main__ - 正常执行逻辑下,导入完成后执行器会自动扫描testing模块内所有继承
unittest.TestCase的类,收集测试用例执行
2. 为什么不加if __name__ == '__main__':就找不到测试用例
你没有加判断的情况下,unittest.main()会在testing模块被导入的阶段就直接运行:
unittest.main()默认的扫描逻辑是从__main__模块(也就是当前的入口程序_jb_unittest_runner.py)中查找测试用例,自然找不到你写在testing模块里的用例- 无测试用例的情况下
unittest.main()会直接输出Ran 0 tests然后结束进程,PyCharm的执行器还没来得及进行自己的测试收集流程,程序就已经退出,最终你看到的就是空测试套件的结果。
3. 为什么加了判断后运行正常
加了if __name__ == '__main__':的判断后,unittest.main()只会在testing.py被作为普通脚本直接运行时才会触发:
- PyCharm用unittest执行器导入testing模块的阶段,这行代码不会运行,不会打断执行器的正常流程
- 执行器可以正常扫描到testing模块里的测试类,收集用例执行,结果就符合预期。
4. 你说的“PyCharm里不加这行也能跑测试”的情况
这种情况是你之前的运行配置被设为了「普通Python脚本」模式,而非「unittest测试」模式:此时PyCharm会直接把testing.py作为入口程序运行,__name__为__main__,unittest.main()可以正常从当前模块扫描到测试用例运行,所以不会出问题。
内容的提问来源于stack exchange,提问作者serg_new_user
相关产品推荐
相关产品推荐

