2016-07-26 110 views
4

我想单元测试一些使用日志库的算法。如何使用日志记录,pytest夹具和capsys?

我有一个夹具可以创建一个记录器。

在我的第1个测试用例中,我没有使用这个灯具并使用打印来记录到stdout。该测试案例通过

在我的第二个测试案例,我使用这个夹具,但没有在pytest文档中记录。我只是在我的测试中调用相关函数来获取记录器。然后我使用记录器登录到stdout。该测试案例通过

在我的第三个测试案例,我使用pytest doc中记录的这个fixture。夹具作为参数传递给测试函数。然后我使用记录器登录到stdout。这个测试案例失败!它在stdout中找不到任何东西。但是在错误消息中,它表示我的日志处于捕获的stdout调用中。

我在做什么错?

import pytest 

import logging 
import sys 

@pytest.fixture() 
def logger(): 

    logger = logging.getLogger('Some.Logger') 
    logger.setLevel(logging.INFO) 
    stdout = logging.StreamHandler(sys.stdout) 
    logger.addHandler(stdout) 

    return logger 

def test_print(capsys): 

    print 'Bouyaka!' 

    stdout, stderr = capsys.readouterr() 
    assert 'Bouyaka!' in stdout 

    # passes 

def test_logger_without_fixture(capsys): 

    logger().info('Bouyaka!') 

    stdout, stderr = capsys.readouterr() 
    assert 'Bouyaka!' in stdout 

    # passes 

def test_logger_with_fixture(logger, capsys): 

    logger.info('Bouyaka!') 

    stdout, stderr = capsys.readouterr() 
    assert 'Bouyaka!' in stdout 

    # fails with this error: 
    # >  assert 'Bouyaka!' in stdout 
    # E  assert 'Bouyaka!' in '' 
    # 
    # tests/test_logging.py:21: AssertionError 
    # ---- Captured stdout call ---- 
    # Bouyaka! 

如果我按顺序重新排列测试用例,没有任何变化。

回答

4

我猜测记录器是在capsys夹具设置之前创建的(通过夹具)。

一些想法:

  • 使用pytest-catchlog插件
  • 也许扭转logger, capsys
  • logger请求capsys夹具
  • 使用capfd这是更低级拍摄,而不会改变sys
5

非常感谢您的想法!

反向logger, capsys,使logger请求capsys夹具和使用capfd不会改变任何东西。

我试过pytest-catchlog插件和它正常工作

import pytest 

import logging 

@pytest.fixture() 
def logger(): 

    logger = logging.getLogger('Some.Logger') 
    logger.setLevel(logging.INFO) 

    return logger 

def test_logger_with_fixture(logger, caplog): 

    logger.info('Bouyaka!') 

    assert 'Bouyaka!' in caplog.text 

    # passes! 

在我最初的测试中,我登录到stdout和stderr并捕获它们。 这是一个更好的解决方案,因为我不需要这个调整来检查我的日志是否正常工作。

好了,现在我只需要返工我所有的测试使用caplog,但是这是我自己的事;)

剩下的唯一的事情,现在我有一个更好的解决办法,是要了解什么是错的在我的原始测试案例def test_logger_with_fixture(logger, capsys)

相关问题