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()
?
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
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