2011-05-30 9 views
13

En el marco de Python unittest, ¿hay alguna forma de pasar una prueba de unidad si no se presentó una excepción y si no con AssertRaise?Pasar una prueba de unidad de Python si no se produce una excepción

+0

Solo he encontrado la necesidad de hacer esto cuando pruebo el código heredado y hago una serie de pruebas de cordura. Estas son pruebas sin ningún Asserts (básicamente verificando que el bloque de código se ejecuta sin explotar). Cualquier excepción inesperada no pasa la prueba de todos modos, no estoy seguro de si el framework de Python funciona de manera similar a la familia xUnit. – Gishu

+1

Posible duplicado de: http://stackoverflow.com/questions/4319825/python-unittest-opposite-of-assertraises –

Respuesta

12

Si entiendo bien su pregunta, usted podría hacer algo como esto:

def test_does_not_raise_on_valid_input(self): 
    raised = False 
    try: 
     do_something(42) 
    except: 
     raised = True 
    self.assertFalse(raised, 'Exception raised') 

... asumiendo que tiene una prueba correspondiente que la correcta Exception consigue elevadas en una entrada no válida, por supuesto:

def test_does_raise_on_invalid_input(self): 
    self.assertRaises(OutOfCheese, do_something, 43) 

Sin embargo, como se ha señalado en los comentarios, debe tener en cuenta qué es lo que son en realidad pruebas. Es probable que una prueba como ...

def test_what_is_42(self): 
    self.assertEquals(do_something(42), 'Meaning of life') 

... es mejor, ya que pone a prueba el comportamiento deseado del sistema y fallará si una excepción es elevada.

+2

En mi humilde opinión algo así debería ser parte de la clase unittest.TestCase, es una cosa incómoda de querer, pero yo no puede ser la única persona que lo quiere. –

+0

@ Levi Campbell: estoy de acuerdo, un método 'assertDoesNotRaise()' sería más ordenado. N.B: He editado mi respuesta desde que usted aceptó. – Johnsyweb

+10

¿Por qué molestarse en detectar primero una excepción y luego plantear una diferente? Simplemente llame a 'do_something()', y si se genera una excepción, la prueba falla automáticamente. Esta es también la razón por la cual 'assertDoesNotRaise()' no existe. –

9

Muchos de los comentarios en esta página tratan los errores y fallas como equivalentes, que no lo son. La solución correcta en mi opinión es fallar explícitamente la prueba si se produce la excepción. Ej .:

def test_does_not_error(self): 
    try: 
     code_under_test() 
    except ThatException: 
     self.fail("code_under_test raised ThatException") 
+1

De acuerdo: mientras que la salida de la consola para errores y fallas es comparada por una lectura humana, la mayoría de las herramientas de pruebas unitarias las tratan de forma bastante diferente, ¿no? – hBy2Py

-1

Como se señaló en un comentario de Sven, sólo tiene que llamar a su funcionalidad, por ejemplo, do_something(). Si se genera una excepción no controlada, ¡la prueba falla automáticamente! Realmente no hay razón para hacer otra cosa. Esta es también la razón por la cual assertDoesNotRaise() no existe.

+0

¿Por qué el voto a favor? La respuesta es perfectamente precisa. –

Cuestiones relacionadas