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
assertNotRaises
método que comparta el 90% de su código / comportamiento conassertRaises
aproximadamente ~ 30 líneas de código. Vea mi respuesta a continuación para más detalles.hypothesis
fin 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 obtenerlaTrue
si no falla.assume(func(a) is not None)
funciona, supongoRespuestas:
fuente
ValueError
, pero enValueError
su 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
xfail
decorador 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
assertNotRaises
reutilizando aproximadamente el 90% de la implementación original deassertRaises
en elunittest
módulo. Con este enfoque, terminas con unassertNotRaises
mé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
assertNotRaises
mé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 delassertNotRaises
método en acción . Al igual queassertRaises
, puede pasar un invocable y argumentos aassertNotRaises
, o puede usarlo en unawith
declaración. La demostración en vivo incluye una prueba de casos que demuestra queassertNotRaises
funciona según lo previsto.Detalles
La implementación de
assertRaises
inunittest
es bastante complicada, pero con un poco de subclases inteligentes puede anular e invertir su condición de falla.assertRaises
es un método corto que básicamente solo crea una instancia de launittest.case._AssertRaisesContext
clase y la devuelve (consulte su definición en elunittest.case
módulo). Puede definir su propia_AssertNotRaisesContext
clase subclasificando_AssertRaisesContext
y 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
assertNotRaises
método disponible para ellos.fuente
traceback
en suelse
declaración viene?import
. Su fijopodría modificarse si necesita aceptar parámetros.
llamar como
fuente
Lo he encontrado útil para parchear mono de la
unittest
siguiente 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
assertMayRaise
aunittest.TestSuite
usted, puede fingir que es parte de launittest
biblioteca.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
PathIsNotAValidOne
se 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