warning unittest unit tests run examples example español assertraises python unit-testing exception-handling warnings

tests - unittest python español



¿Cómo probar con Unittest de Python que se ha lanzado una advertencia? (4)

Tengo una función siguiente en Python y quiero probar con unittest que si la función obtiene 0 como argumento, arroja una advertencia. Ya probé assertRaises, pero como no planteo la advertencia, eso no funciona.

def isZero( i): if i != 0: print "OK" else: warning = Warning( "the input is 0!") print warning return i

Gracias, Tomás


Comenzando con Python 3.2, puede simplemente usar el método assertWarns() .

with self.assertWarns(Warning): do_something()


La answer @ire_and_curses es bastante útil y, creo, canónica. Aquí hay otra manera de hacer lo mismo. Esto requiere la excelente biblioteca Mock Michael Foord.

import unittest, warnings from mock import patch_object def isZero( i): if i != 0: print "OK" else: warnings.warn( "the input is 0!") return i class Foo(unittest.TestCase): @patch_object(warnings, ''warn'') def test_is_zero_raises_warning(self, mock_warn): isZero(0) self.assertTrue(mock_warn.called) if __name__ == ''__main__'': unittest.main()

El nifty patch_object te permite patch_object el método warn .


Puede escribir su propia función assertWarns para encapsular el contexto catch_warnings. Lo acabo de implementar de la siguiente manera, con un mixin:

class WarningTestMixin(object): ''A test which checks if the specified warning was raised'' def assertWarns(self, warning, callable, *args, **kwds): with warnings.catch_warnings(record=True) as warning_list: warnings.simplefilter(''always'') result = callable(*args, **kwds) self.assertTrue(any(item.category == warning for item in warning_list))

Un ejemplo de uso:

class SomeTest(WarningTestMixin, TestCase): ''Your testcase'' def test_something(self): self.assertWarns( UserWarning, your_function_which_issues_a_warning, 5, 10, ''john'', # args foo=''bar'' # kwargs )

La prueba pasará si al menos una de las advertencias emitidas por your_function es de tipo UserWarning.


Puede usar el catch_warnings contexto catch_warnings . Esencialmente, esto le permite simular el controlador de advertencias para que pueda verificar los detalles de la advertencia. Consulte los documentos oficiales para obtener una explicación más completa y un código de prueba de muestra.

import warnings def fxn(): warnings.warn("deprecated", DeprecationWarning) with warnings.catch_warnings(record=True) as w: # Cause all warnings to always be triggered. warnings.simplefilter("always") # Trigger a warning. fxn() # Verify some things assert len(w) == 1 assert issubclass(w[-1].category, DeprecationWarning) assert "deprecated" in str(w[-1].message)