Quiero escribir una prueba para establecer que una excepción no se genera en una circunstancia determinada.
Es sencillo a prueba si una excepción se levantó ...
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
... pero cómo puedes hacer lo contrario .
Algo como esto, lo que busco ...
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
python
unit-testing
glaucon
fuente
fuente

assertNotRaisesmétodo que comparta el 90% de su código / comportamiento conassertRaisesaproximadamente ~ 30 líneas de código. Vea mi respuesta a continuación para más detalles.hypothesisfin de asegurarme de que produzcan la misma salida para todo tipo de entrada, sin tener en cuenta los casos en que el original genera una excepción.assume(func(a))no funciona porque la salida puede ser una matriz con un valor de verdad ambiguo. Así que solo quiero llamar a una función y obtenerlaTruesi no falla.assume(func(a) is not None)funciona, supongoRespuestas:
fuente
ValueError, pero enValueErrorsu lugar se genera, su prueba debe salir con una condición de falla, no una de error. Por otro lado, si al ejecutar el mismo código generarías unKeyError, eso sería un error, no un error. En python, de manera diferente a otros lenguajes, las excepciones se usan de manera rutinaria para el flujo de control, por eso tenemos laexcept <ExceptionName>sintaxis. En ese sentido, la solución de user9876 es simplemente incorrecta.Esa es la suposición predeterminada: no se generan excepciones.
Si no dice nada más, eso se supone en cada prueba.
No tienes que escribir ninguna afirmación para eso.
fuente
Solo llama a la función. Si genera una excepción, el marco de prueba de la unidad marcará esto como un error. Es posible que desee agregar un comentario, por ejemplo:
fuente
xfaildecorador en pytest.Soy el póster original y acepté la respuesta anterior de DGH sin haberla usado primero en el código.
Una vez que lo utilicé, me di cuenta de que necesitaba un pequeño ajuste para realmente hacer lo que tenía que hacer (para ser justos con DGH, ¡él / ella dijo "o algo similar"!).
Pensé que valía la pena publicar el ajuste aquí para beneficio de otros:
Lo que intentaba hacer aquí era asegurarme de que si se intentaba crear una instancia de un objeto Aplicación con un segundo argumento de espacios, se generaría pySourceAidExceptions.PathIsNotAValidOne.
Creo que usar el código anterior (basado en gran medida en la respuesta de DGH) hará eso.
fuente
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)debería hacer el trabajo en este caso.Puede definir
assertNotRaisesreutilizando aproximadamente el 90% de la implementación original deassertRaisesen elunittestmódulo. Con este enfoque, terminas con unassertNotRaisesmétodo que, aparte de su condición de falla inversa, se comporta de manera idénticaassertRaises.TLDR y demostración en vivo
Resulta sorprendentemente fácil agregarle un
assertNotRaisesmétodounittest.TestCase(me tomó alrededor de 4 veces más tiempo escribir esta respuesta que el código). Aquí hay una demostración en vivo delassertNotRaisesmétodo en acción . Al igual queassertRaises, puede pasar un invocable y argumentos aassertNotRaises, o puede usarlo en unawithdeclaración. La demostración en vivo incluye una prueba de casos que demuestra queassertNotRaisesfunciona según lo previsto.Detalles
La implementación de
assertRaisesinunittestes bastante complicada, pero con un poco de subclases inteligentes puede anular e invertir su condición de falla.assertRaiseses un método corto que básicamente solo crea una instancia de launittest.case._AssertRaisesContextclase y la devuelve (consulte su definición en elunittest.casemódulo). Puede definir su propia_AssertNotRaisesContextclase subclasificando_AssertRaisesContexty anulando su__exit__método:Normalmente define clases de casos de prueba haciendo que hereden de
TestCase. Si en cambio heredas de una subclaseMyTestCase:Todos sus casos de prueba ahora tendrán el
assertNotRaisesmétodo disponible para ellos.fuente
tracebacken suelsedeclaración viene?import. Su fijopodría modificarse si necesita aceptar parámetros.
llamar como
fuente
Lo he encontrado útil para parchear mono de la
unittestsiguiente manera:Esto aclara la intención al probar la ausencia de una excepción:
Esto también simplifica las pruebas en un bucle, que a menudo me encuentro haciendo:
fuente
assertMayRaiseaunittest.TestSuiteusted, puede fingir que es parte de launittestbiblioteca.Si pasa una clase de excepción a
assertRaises(), se proporciona un administrador de contexto. Esto puede mejorar la legibilidad de sus pruebas:Esto le permite probar casos de error en su código.
En este caso, está probando que
PathIsNotAValidOnese genera cuando pasa parámetros no válidos al constructor de la aplicación.fuente
puedes intentarlo así. try: self.assertRaises (None, function, arg1, arg2) excepto: pase si no coloca el código dentro del bloque try, a través de la excepción 'AssertionError: None not raised "y el caso de prueba fallará. El caso de prueba se pasará si se coloca dentro del bloque try, que es el comportamiento esperado.
fuente
Una forma directa de garantizar que el objeto se inicialice sin ningún error es probar la instancia de tipo del objeto.
Aquí hay un ejemplo :
fuente