【问题标题】:python unittest module, log failures to filepython unittest模块,记录失败到文件
【发布时间】:2017-07-18 00:05:17
【问题描述】:

我正在寻找清理正常的 python unittest 输出。我希望控制台输出仍然是

test_isupper (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... ok
test_fail (__main__.TestFail) ... ERROR

----------------------------------------------------------------------
Ran 4 tests in 0.001s

OK

但是对于失败测试,​​我想捕获详细的输出,并将其放入日志文件中。所以与其与控制台输出内联...

======================================================================
FAIL: test_fail (__main__.TestFail)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line x
    self.assertTrue(False)
AssertionError: False is not True

======================================================================

与任何调试级别的记录器输出一起记录到文件中以供进一步调查。有没有办法重载 unittest.testcase 中的记录器来做我想做的事?

我应该提一下,我对 python 还是很陌生...

【问题讨论】:

  • 你必须向社区分享测试的完整代码,测试失败的最低限度,以便任何人都可以帮助你,只有这些数据是不可能的
  • 代码对问题并不重要,因为问题与操纵和重定向“unittest”模块的输出有关。我给出的示例失败测试只有两行...def test_fail(self): assertTrue(False)

标签: python-3.x logging python-unittest


【解决方案1】:

通过使用testResult 对象,我最终能够获得足够接近我想要的结果。从该对象中,我能够获取包含已通过、失败或出现错误的不同测试数据的元组。然后是一个简单的创建一个“prettyPrint”方法来获取这个对象并很好地打印出内容。

确切的配方是:

suite = unittest.TestLoader().loadTestsFromModule( className )
testResult = unittest.TextTestRunner(verbosity=3).run( suite ) 

希望这可以帮助其他想要做类似事情的人。

【讨论】:

  • 但是调用unittest.TextTestRunner(verbosity=3).run( suite ) 仍然会将堆栈跟踪输出到终端,而不是输出到文件中。而且您也没有使用您在示例中提到的TestResult
【解决方案2】:

通过向构造函数提供stream 参数,可以将TextTestRunner 输出重定向到文件。稍后,在套件上使用run() 将返回TextTestResult,您可以将其打印出来。像这样的:

logs_filename = 'logs.txt'

def print_test_results_summary(result):
    n_failed    = len(result.failures) + len(result.unexpectedSuccesses)
    n_crashed   = len(result.errors)
    n_succeeded = result.testsRun - n_failed - n_crashed
    print(f'''See for details {logs_filename} file.
Results: Total: {result.testsRun}, Crashed: {n_crashed}, Failed: {n_failed}, Succeeded: {n_succeeded}''')

with open(logs_filename, 'w') as log_file:
    suite = unittest.defaultTestLoader.loadTestsFromModule(className)
    testResult = unittest.TextTestRunner(log_file, verbosity=3).run(suite)
    print_test_results_summary(testResult)

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2013-07-16
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多