我有一个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 Community Edition 2017.3.3 \ helpers \ pycharm_jb_unittest_runner.py”,第35行,在main中(argv = args,module = None,testRunner = unittestpy.TeamcityTestRunner,buffer = not JB_DISABLE_BUFFERING)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ 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行,在run return super(TeamcityTestRunner,self).run(test)文件”C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ runner.py“,第176行,在运行测试(结果)文件”C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36 -32 \ Lib \ unittest \ suite.py“,第84行,在调用返回self.run(* args,** kwds)文件”C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py“,第122行,在运行测试(结果)文件”C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py“,第84行,在调用返回self.run(* args,** kwds)文件”C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ unittest \ suite.py“,第122行,在运行测试(结果)文件”C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py“,line 84,在调用返回self.run(* args,** kwds)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ suite.py”,第122行,in运行测试(结果)文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ case.py”,第653行,在调用返回self.run(* args,** kwds)运行result.stopTest(self)文件“C:\ Program Files”中的文件“C:\ Users \ Marialena \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ unittest \ case.py”,第624行\ JetBrains \ PyCharm \ PyCharm社区版2017.3.3 \ helpers \ pycharm \ teamcity \ unit testpy.py“,第260行,在stopTest中输出= sys.stdout.getvalue()AttributeError:'_ io.TextIOWrapper'对象没有属性'getvalue'
对此有任何帮助吗?谢谢。
看起来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。