web-dev-qa-db-fra.com

Test de la sortie de journalisation avec pytest

J'essaie d'écrire un test, en utilisant pytest, qui vérifierait qu'une fonction spécifique écrit un avertissement dans le journal en cas de besoin. Par exemple:

Dans module.py:

import logging
LOGGER = logging.getLogger(__name__)

def run_function():
    if something_bad_happens:
        LOGGER.warning('Something bad happened!')

Dans test_module.py:

import logging
from module import run_function

LOGGER = logging.getLogger(__name__)

def test_func():
    LOGGER.info('Testing now.')
    run_function()
    ~ somehow get the stdout/log of run_function() ~
    assert 'Something bad happened!' in output

J'ai vu que vous pouvez supposément obtenir le journal ou le stdout/stderr avec pytest en passant capsys ou caplog comme argument au test, puis en utilisant capsus.readouterr() ou caplog.records pour accéder à la sortie.

Cependant, lorsque j'essaie ces méthodes, je ne vois que "Tester maintenant.", Et non "Quelque chose de mauvais s'est produit!". Il semble que la sortie de journalisation qui se produit dans l'appel à run_function() n'est pas accessible à partir de test_func()?

La même chose se produit si j'essaie une méthode plus directe, comme sys.stdout.getvalue(). Ce qui est déroutant, car run_function() écrit sur le terminal, donc je pense que ce serait accessible depuis stdout...?

Fondamentalement, est-ce que quelqu'un sait comment je peux accéder à ce "Quelque chose de mal s'est passé!" de l'intérieur test_func()?

14
lauren.marietta

Je ne sais pas pourquoi cela n'a pas fonctionné lorsque je l'ai essayé auparavant, mais cette solution fonctionne pour moi maintenant:

Dans test_module.py:

import logging
from module import run_function

LOGGER = logging.getLogger(__name__)

def test_func(caplog):
    LOGGER.info('Testing now.')
    run_function()
    assert 'Something bad happened!' in caplog.text
7
lauren.marietta

test_module.py devrait ressembler à ceci:

import logging
from module import run_function

LOGGER = logging.getLogger(__name__)

def test_func(caplog):
    with caplog.at_level(logging.WARNING):
        run_function()
    assert 'Something bad happened!' in caplog.text

ou:

import logging
from module import run_function

LOGGER = logging.getLogger(__name__)

def test_func(caplog):
    caplog.set_level(logging.WARNING):
    run_function()
    assert 'Something bad happened!' in caplog.text

La documentation pour la journalisation de la capture pytest est ici

1
Krzysieqq