123 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
import logging
 | 
						|
 | 
						|
import pytest
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
sublogger = logging.getLogger(__name__ + '.baz')
 | 
						|
 | 
						|
 | 
						|
def test_fixture_help(testdir):
 | 
						|
    result = testdir.runpytest('--fixtures')
 | 
						|
    result.stdout.fnmatch_lines(['*caplog*'])
 | 
						|
 | 
						|
 | 
						|
def test_change_level(caplog):
 | 
						|
    caplog.set_level(logging.INFO)
 | 
						|
    logger.debug('handler DEBUG level')
 | 
						|
    logger.info('handler INFO level')
 | 
						|
 | 
						|
    caplog.set_level(logging.CRITICAL, logger=sublogger.name)
 | 
						|
    sublogger.warning('logger WARNING level')
 | 
						|
    sublogger.critical('logger CRITICAL level')
 | 
						|
 | 
						|
    assert 'DEBUG' not in caplog.text
 | 
						|
    assert 'INFO' in caplog.text
 | 
						|
    assert 'WARNING' not in caplog.text
 | 
						|
    assert 'CRITICAL' in caplog.text
 | 
						|
 | 
						|
 | 
						|
def test_change_level_undo(testdir):
 | 
						|
    """Ensure that 'set_level' is undone after the end of the test"""
 | 
						|
    testdir.makepyfile('''
 | 
						|
        import logging
 | 
						|
 | 
						|
        def test1(caplog):
 | 
						|
            caplog.set_level(logging.INFO)
 | 
						|
            # using + operator here so fnmatch_lines doesn't match the code in the traceback
 | 
						|
            logging.info('log from ' + 'test1')
 | 
						|
            assert 0
 | 
						|
 | 
						|
        def test2(caplog):
 | 
						|
            # using + operator here so fnmatch_lines doesn't match the code in the traceback
 | 
						|
            logging.info('log from ' + 'test2')
 | 
						|
            assert 0
 | 
						|
    ''')
 | 
						|
    result = testdir.runpytest_subprocess()
 | 
						|
    result.stdout.fnmatch_lines([
 | 
						|
        '*log from test1*',
 | 
						|
        '*2 failed in *',
 | 
						|
    ])
 | 
						|
    assert 'log from test2' not in result.stdout.str()
 | 
						|
 | 
						|
 | 
						|
def test_with_statement(caplog):
 | 
						|
    with caplog.at_level(logging.INFO):
 | 
						|
        logger.debug('handler DEBUG level')
 | 
						|
        logger.info('handler INFO level')
 | 
						|
 | 
						|
        with caplog.at_level(logging.CRITICAL, logger=sublogger.name):
 | 
						|
            sublogger.warning('logger WARNING level')
 | 
						|
            sublogger.critical('logger CRITICAL level')
 | 
						|
 | 
						|
    assert 'DEBUG' not in caplog.text
 | 
						|
    assert 'INFO' in caplog.text
 | 
						|
    assert 'WARNING' not in caplog.text
 | 
						|
    assert 'CRITICAL' in caplog.text
 | 
						|
 | 
						|
 | 
						|
def test_log_access(caplog):
 | 
						|
    caplog.set_level(logging.INFO)
 | 
						|
    logger.info('boo %s', 'arg')
 | 
						|
    assert caplog.records[0].levelname == 'INFO'
 | 
						|
    assert caplog.records[0].msg == 'boo %s'
 | 
						|
    assert 'boo arg' in caplog.text
 | 
						|
 | 
						|
 | 
						|
def test_record_tuples(caplog):
 | 
						|
    caplog.set_level(logging.INFO)
 | 
						|
    logger.info('boo %s', 'arg')
 | 
						|
 | 
						|
    assert caplog.record_tuples == [
 | 
						|
        (__name__, logging.INFO, 'boo arg'),
 | 
						|
    ]
 | 
						|
 | 
						|
 | 
						|
def test_unicode(caplog):
 | 
						|
    caplog.set_level(logging.INFO)
 | 
						|
    logger.info(u'bū')
 | 
						|
    assert caplog.records[0].levelname == 'INFO'
 | 
						|
    assert caplog.records[0].msg == u'bū'
 | 
						|
    assert u'bū' in caplog.text
 | 
						|
 | 
						|
 | 
						|
def test_clear(caplog):
 | 
						|
    caplog.set_level(logging.INFO)
 | 
						|
    logger.info(u'bū')
 | 
						|
    assert len(caplog.records)
 | 
						|
    assert caplog.text
 | 
						|
    caplog.clear()
 | 
						|
    assert not len(caplog.records)
 | 
						|
    assert not caplog.text
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def logging_during_setup_and_teardown(caplog):
 | 
						|
    caplog.set_level('INFO')
 | 
						|
    logger.info('a_setup_log')
 | 
						|
    yield
 | 
						|
    logger.info('a_teardown_log')
 | 
						|
    assert [x.message for x in caplog.get_records('teardown')] == ['a_teardown_log']
 | 
						|
 | 
						|
 | 
						|
def test_caplog_captures_for_all_stages(caplog, logging_during_setup_and_teardown):
 | 
						|
    assert not caplog.records
 | 
						|
    assert not caplog.get_records('call')
 | 
						|
    logger.info('a_call_log')
 | 
						|
    assert [x.message for x in caplog.get_records('call')] == ['a_call_log']
 | 
						|
 | 
						|
    assert [x.message for x in caplog.get_records('setup')] == ['a_setup_log']
 | 
						|
 | 
						|
    # This reachers into private API, don't use this type of thing in real tests!
 | 
						|
    assert set(caplog._item.catch_log_handlers.keys()) == {'setup', 'call'}
 |