J'écris des tests unitaires en utilisant nose, et je voudrais vérifier si une fonction déclenche un avertissement (la fonction utilise warnings.warn
). Est-ce quelque chose qui peut facilement être fait?Vérifier qu'une fonction déclenche un avertissement avec des tests de nez
7
A
Répondre
9
def your_code():
# ...
warnings.warn("deprecated", DeprecationWarning)
# ...
def your_test():
with warnings.catch_warnings(record=True) as w:
your_code()
assert len(w) > 1
Au lieu de simplement vérifier la longueur, vous pouvez le vérifier en profondeur, bien sûr:
assert str(w.args[0]) == "deprecated"
en Python 2.7 ou version ultérieure, vous pouvez le faire avec la dernière vérification que:
assert str(w[0].message[0]) == "deprecated"
1
Il y a (au moins) deux façons de le faire. Vous pouvez attraper l'avertissement dans le list
de warnings.WarningMessage
s dans le test ou utiliser mock
à patch
le warnings
importé dans votre module. Je pense que la version patch
est plus générale.
raise_warning.py:
import warnings
def should_warn():
warnings.warn('message', RuntimeWarning)
print('didn\'t I warn you?')
raise_warning_tests.py:
import unittest
from mock import patch
import raise_warning
class TestWarnings(unittest.TestCase):
@patch('raise_warning.warnings.warn')
def test_patched(self, mock_warnings):
"""test with patched warnings"""
raise_warning.should_warn()
self.assertTrue(mock_warnings.called)
def test_that_catches_warning(self):
"""test by catching warning"""
with raise_warning.warnings.catch_warnings(True) as wrn:
raise_warning.should_warn()
# per-PEP8 check for empty sequences by their Truthiness
self.assertTrue(wrn)
ne devrait pas être le test 'LEN (w)> 0', nous voulons juste vérifier si les avertissements'. La liste WarningMessage' est vide. Ou, suivant [PEP8] (https://www.python.org/dev/peps/pep-0008/#programming-recommendations), vérifiez que les séquences vides sont fausses –