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

问题描述 投票:0回答:1

我有一个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 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'

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

python python-3.x file unit-testing output
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.