在PyCharm中运行Python的unit测试时,出现‘file‘ object has no attribute ‘getvalue’的错误

先看一个报错:

Traceback (most recent call last):
  File "/snap/pycharm-community/323/plugins/python-ce/helpers/pydev/pydevd.py", line 1496, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/snap/pycharm-community/323/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py", line 35, in <module>
    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 runTests
    self.result = testRunner.run(self.test)
  File "/snap/pycharm-community/323/plugins/python-ce/helpers/pycharm/teamcity/unittestpy.py", line 310, in run
    return super(TeamcityTestRunner, self).run(test)
  File "/usr/lib/python2.7/unittest/runner.py", line 151, in run
    test(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 run
    test(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 run
    test(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 run
    result.stopTest(self)
  File "/snap/pycharm-community/323/plugins/python-ce/helpers/pycharm/teamcity/unittestpy.py", line 263, in stopTest
    output = 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强相关的东西了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值