我有一个python脚本,我在其中编写了一些单元测试,我正在使用selenium。
我想提取控制台的整个输出(不仅是我的打印件,还有单元测试相关的结果),以便稍后我可以在我的测试管理工具中导入它们。
这是我的代码:
import unittest
from selenium import webdriver
import json
import requests
import sys
class TestUbuntuHomepage(unittest.TestCase):
global strs
strs = []
def setUp(self):
sys.stdout = open("C:\\Users\\Marialena\\Downloads\\out2.log", 'wt')
self.driver = webdriver.Firefox(executable_path="C:\\Users\\Marialena\\Downloads\\selenium-drivers\\geckodriver")
def testTitle(self):
self.driver.get('http://www.ubuntu.com/')
if self.assertIn('Ubuntu', self.driver.title):
strs.append('test'})
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
使用sys.stdout = open("C:\\Users\\Marialena\\Downloads\\out2.log", 'wt')
我在文件中输入了我打印的所有内容,我也得到了这个例外:
回溯(最近一次调用最后一次):文件“C:\ Program Files \ JetBrains \ PyCharm \ PyCharm社区版 2017.3.3 \ helpers \ pycharm_jb_unittest_runner.py“,第35行,in main(argv = args,module = None,testRunner = unittestpy.TeamcityTestRunner,buffer = not JB_DISABLE_BUFFERING)文件 “C:\用户\ Marialena \应用程序数据\本地\程序\ Python的\ Python36-32 \ LIB \单元测试\ main.py” 第95行,在 init 中 self.runTests()文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ main.py”, 第256行,在runTests中 self.result = testRunner.run(self.test)文件“C:\ Program Files \ JetBrains \ PyCharm \ PyCharm Community Edition 2017.3.3 \ helpers \ pycharm \ teamcity \ unittestpy.py“,第304行,在运行中 return super(TeamcityTestRunner,self).run(test)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ runner.py”, 第176行,在运行中 test(result)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py”, 第84行,在通话中 return self.run(* args,** kwds)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py”, 第122行,在运行中 test(result)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py”, 第84行,在通话中 return self.run(* args,** kwds)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py”, 第122行,在运行中 test(result)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py”, 第84行,在通话中 return self.run(* args,** kwds)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py”, 第122行,在运行中 test(result)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ case.py”, 第653行,致电 return self.run(* args,** kwds)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ case.py”, 第624行,在运行中 result.stopTest(self)文件“C:\ Program Files \ JetBrains \ PyCharm \ PyCharm社区版 2017.3.3 \ helpers \ pycharm \ teamcity \ unittestpy.py“,第260行,在stopTest中 output = sys.stdout.getvalue()AttributeError:'_ io.TextIOWrapper'对象没有属性'getvalue'
对此有任何帮助吗?谢谢。
答案 0 :(得分:1)
看起来 PyCharm 正在用自己的流替换sys.stdout,所以当你用文件流替换它时, PyCharm 无法使用它。
因此,请将您的干预限制在一个功能的范围内,以避免干扰 PyCharm 。
这是一般的想法:
def testTitle(self):
original_stdout = sys.stdout
sys.stdout = open("C:\\Users\\Marialena\\Downloads\\out2.log", 'wt')
# your test code goes here
sys.stdout = original_stdout
现在,从外部看,sys.stdout
似乎从未被修改过。
当然,你需要改进一些事情:
stdout
块finally
@contextmanager
def redirected_stdout(filename):
original_stdout = sys.stdout
sys.stdout = open(filename, 'at')
try:
yield
finally:
sys.stdout = original_stdout
然后:
def testTitle(self):
with redirected_stdout("C:\\Users\\Marialena\\Downloads\\out2.log"):
# your test code goes here
<强>可替换地:强>
调查 PyCharm 期望sys.stdout
如何表现并创建自己的类来执行这两项操作:写入文件和提供 PyCharm <的API / em>期待。