在PyCharm中运行Python的unit测试时,出现‘file‘ object has no attribute ‘getvalue’的错误
创始人
2025-06-01 21:43:32

先看一个报错:

Traceback (most recent call last):File "/snap/pycharm-community/323/plugins/python-ce/helpers/pydev/pydevd.py", line 1496, in _execpydev_imports.execfile(file, globals, locals)  # execute the scriptFile "/snap/pycharm-community/323/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py", line 35, in sys.exit(main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner, buffer=not JB_DISABLE_BUFFERING))File "/usr/lib/python2.7/unittest/main.py", line 95, in __init__self.runTests()File "/usr/lib/python2.7/unittest/main.py", line 232, in runTestsself.result = testRunner.run(self.test)File "/snap/pycharm-community/323/plugins/python-ce/helpers/pycharm/teamcity/unittestpy.py", line 310, in runreturn super(TeamcityTestRunner, self).run(test)File "/usr/lib/python2.7/unittest/runner.py", line 151, in runtest(result)File "/usr/lib/python2.7/unittest/suite.py", line 70, in __call__return self.run(*args, **kwds)File "/usr/lib/python2.7/unittest/suite.py", line 108, in runtest(result)File "/usr/lib/python2.7/unittest/suite.py", line 70, in __call__return self.run(*args, **kwds)File "/usr/lib/python2.7/unittest/suite.py", line 108, in runtest(result)File "/usr/lib/python2.7/unittest/case.py", line 393, in __call__return self.run(*args, **kwds)File "/usr/lib/python2.7/unittest/case.py", line 370, in runresult.stopTest(self)File "/snap/pycharm-community/323/plugins/python-ce/helpers/pycharm/teamcity/unittestpy.py", line 263, in stopTestoutput = sys.stdout.getvalue()
AttributeError: 'file' object has no attribute 'getvalue'

就是一个很奇怪的报错,具体的反应就是 sys.stdout.getvalue() ,事实上,在代码中可以看到,sys.stdout 是没有 getvalue() 这么个方法的。所以,问题就跟预想的不大一样了。看看,一些资料的说法:

在PyCharm的新版本(2017.1.3以后)的版本中,引入了一个JB_DISABLE_BUFFERING变量,用来关闭buffer。
buffer官方的解释是:
buffer
If set to true, sys.stdout and sys.stderr will be buffered in between startTest() and stopTest() being called. Collected output will only be echoed onto the real sys.stdout and sys.stderr if the test fails or errors. Any output is also attached to the failure / error message.

就是说buffer这个属性如果被设为True,则在测试的过程中(即:startTest()方法和stopTest()方法之间的具体的每一个测试执行的过程中)sys.stdout和sys.stderr将会变为StringIO类型,但是,当测试失败,出现错误时,或者测试没有错误,正常结束的时候,sys.stdout和sys.stderr就会恢复到原来的类型,那么问题来了,getvalue() 方法是,StringIO的方法,并不是正常的sys.stdout和sys.stderr的方法,所以,当测试出现问题但是还可以继续执行,并未执行到stopTest()的节点时,在这个过程中如果有地方调用了sys.stdout.getvalue(),那肯定会出现没有getvalue()这个错了(因为,当出错的时候,sys.stdout会从StringIO类型被恢复为正常的sys.stdout,正常的 sys.stdout 是没有getvalue()方法的)。 ok,应该解释的很清楚了。

所以,为了避免上述情况的出现,我们就需要对pycharm配置一个参数JB_DISABLE_BUFFERING

方法如下:

 

 这里一定注意,参数JB_DISABLE_BUFFERING必须给值,给什么值不重要,无所谓。完事后,在去执行测试,就一切正常了。

这里注意,以上所述所有的报错,都是在pycharm上run,或者debug执行测试用例才会有的问题,直接在terminal上通过cmd去执行,啥错也没有....好吧,这东西,确实是属于跟pycharm强相关的东西了。

相关内容

热门资讯

陕西省首届单板滑雪F级挑战赛在... 来源:环球网 第十二届全国大众冰雪季暨陕西省单板滑雪(F级)挑战赛12月27日在宝鸡鳌山滑雪度假区迎...
银兰高铁三年来累计发送旅客91... 中新网银川12月29日电 (记者 杨迪)2025年12月29日是银兰高铁贯通运营三周年,记者当天从中...
面向应届生,北京朝阳区多所学校... 转自:北京日报客户端北京市朝阳区教育委员会所属事业单位面向应届毕业生及出站博士后公开招聘公告按照北京...
迪普科技:投资者询问实控人承诺... 投资者提问:请问:2022 年浙江证监局责令郑树生继续履行转让承诺。实控人目前是怎么落实的?如何来完...
中密控股:投资者指其进取心不足... 投资者提问:董秘你好!看看公司股价和业绩,增长幅度连通胀都比不上,股价已经5年没涨了,可怜呀!关键是...