【问题标题】:Store console output in a file - Python , unittest将控制台输出存储在文件中 - Python , unittest
【发布时间】:2018-08-07 08:25:36
【问题描述】:

我有一个 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'),我将打印的所有内容都放入了文件中,并且我也得到了这个异常:

Traceback(最近一次调用最后一次):文件“C:\Program Files\JetBrains\PyCharm\PyCharm 社区版 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) File "C:\Program Files\JetBrains\PyCharm\PyCharm 社区版 2017.3.3\helpers\pycharm\teamcity\unittestpy.py",第 304 行,运行中 return super(TeamcityTestRunner, self).run(test) File "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”, 第 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\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'

这方面有什么帮助吗?谢谢。

【问题讨论】:

  • 这可能是 PyCharm 本身的错误:link here.
  • 我会尝试在tearDown中恢复原来的sys.stdout...
  • @ely 我会看看这是否是 pycharm 问题。谢谢
  • @zvone 我在 tearDown 中也遇到了同样的错误,但谢谢
  • @Marialena 如果即使在 setUp 中执行 self.original_stdout = sys.stdout 并在 tearDown 中执行 sys.stdout = self.original_stdout 之后仍遇到“相同的错误”,您可能应该将整个 stdout 处理移动到每个测试中。似乎 PyCharm 已经用它期望在每次测试运行后出现的东西替换了标准输出。

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


【解决方案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 似乎从未被修改过。

当然,您需要改进一些方面:

  • 处理测试中的异常 - 在 finally 块中恢复 stdout
  • 避免在每次测试中删除文件 - 以追加模式打开文件
  • 避免在每次测试中复制和粘贴此代码 - 制作上下文管理器
@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 的行为方式并创建您自己的类,该类同时执行以下操作:写入文件 提供 API,PyCharm 期待。

【讨论】:

  • 非常感谢您的解决方案、建议和您的时间。但是,我尝试将我的搜索指定为单元测试结果,因此我正在使用以下命令执行我的测试:pytest --junitxml junit-results.xml sel-test.py,我现在能够获得输出并且由此发生的任何错误。不是最好的解决方案,因为我不能直接从我的脚本中使用它,但它仍然有效。
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2022-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多