将控制台输出存储在文件中 - Python,unittest

时间:2018-02-27 16:00:52

标签: python python-3.x file unit-testing output

我有一个python脚本,我在其中编写了一些单元测试,我正在使用selenium。

我想提取控制台的整个输出(不仅是我的打印件,还有单元测试相关的结果),以便稍后我可以在我的测试管理工具中导入它们。

Output

这是我的代码:

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'

对此有任何帮助吗?谢谢。

1 个答案:

答案 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>期待。