python unittest模块,记录文件失败

时间:2017-07-18 00:05:18

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

我希望清理正常的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来说还是一个新手......

2 个答案:

答案 0 :(得分:1)

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

确切的食谱是:

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

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

答案 1 :(得分:0)

通过向构造函数提供TextTestRunner参数,可以将stream输出重定向到文件。之后,在套件上使用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)