PyCharm 2018运行单元测试出现双重回溯的原因咨询
PyCharm 2018运行unittest出现双重回溯的原因及解决办法
有用户遇到了这样的问题:在site_tests.py中编写了如下简单的unittest测试用例:
import unittest class SiteTests(unittest.TestCase): def test(self): self.assertEqual('a', 'b') if __name__ == '__main__': unittest.main()
使用PyCharm 2018默认配置运行该测试时,控制台输出两个回溯信息;但直接用Python命令python site_tests.py运行时,仅显示正常的单个回溯。另外用_jb_unittest_runner.py在控制台运行时,还出现了两个测试套件的输出。想知道PyCharm运行器中为何会出现第二个回溯?
这是PyCharm早期版本里挺常见的unittest运行器封装问题,我来拆解背后的原因:
核心原因:PyCharm自带测试运行器的二次封装逻辑
PyCharm的_jb_unittest_runner.py并不是直接调用Python标准库的unittest运行器,而是在它基础上做了一层封装——目的是为了在IDE里实现更丰富的测试监控功能,比如实时显示测试进度、在编辑器中标记测试结果、统计测试通过率等。
这个封装逻辑直接导致了你遇到的两个现象:
- 双重回溯:运行器在执行测试时,会触发两次异常捕获流程:一次是标准unittest运行器本身输出的异常回溯,另一次是PyCharm的封装层为了把异常信息同步到IDE界面,再次捕获并输出了一遍回溯内容。所以你会看到控制台里出现两个完全相同的回溯。
- 两个测试套件:为了收集完整的测试元数据,PyCharm的运行器会额外执行一次测试用例扫描,或者在内部创建了辅助测试套件,导致控制台输出中显示有两个测试套件被加载。
不同运行方式的差异对比
- 直接用
python site_tests.py运行时,使用的是Python标准库的原生unittest运行器,整个测试流程只执行一次,异常仅被抛出并输出一次,因此只会看到单个回溯。 - 而通过
_jb_unittest_runner.py运行时,因为封装层的二次处理逻辑,就出现了重复的回溯和套件信息。
解决办法:切换到标准unittest运行器
如果你觉得双重回溯干扰问题排查,可以在PyCharm中调整测试运行配置:
- 点击顶部工具栏的运行配置下拉框,选择「Edit Configurations...」
- 在弹出的窗口中找到对应的unittest测试配置项
- 切换到「Configuration」标签页,找到「Test runner」选项,将默认的「PyCharm」改为「Unittest」
- 保存配置后重新运行测试,就只会看到标准的单个回溯输出了
内容的提问来源于stack exchange,提问作者pbaranski
相关产品推荐
相关产品推荐

