Código:
# coding=utf-8
import pytest
def whatever():
return 9/0
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
pytest.fail(exc, pytrace=True)
Salida:
================================ test session starts =================================
platform linux2 -- Python 2.7.3 -- py-1.4.20 -- pytest-2.5.2
plugins: django, cov
collected 1 items
pytest_test.py F
====================================== FAILURES ======================================
___________________________________ test_whatever ____________________________________
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
> pytest.fail(exc, pytrace=True)
E Failed: integer division or modulo by zero
pytest_test.py:12: Failed
============================== 1 failed in 1.16 seconds ==============================
¿Cómo hacer pytest print traceback, para ver en qué parte de la whatever
función se generó una excepción?
python
unit-testing
testing
pytest
Gill Bates
fuente
fuente
Respuestas:
pytest.raises(Exception)
es lo que necesitasCódigo
Salida
Tenga en cuenta que
e_info
guarda el objeto de excepción para que pueda extraer detalles de él. Por ejemplo, si desea verificar la pila de llamadas de excepción u otra excepción anidada en su interior.fuente
e_info
. Para los desarrolladores más familiarizados con ciertos otros lenguajes, no es obvio que el alcance de see_info
extienda fuera delwith
bloque.Te refieres a algo como esto:
fuente
excinfo.value.message
no funcionó para mí, tuve que usarstr(excinfo.value)
, agregó una nueva respuestaassert excinfo.value.args[0] == 'some info'
es la forma directa de acceder al mensajeassert excinfo.match(r"^some info$")
funciona bien3.1
, puede usar el argumento de la palabra clavematch
para afirmar que la excepción coincide con un texto o expresión regular:with raises(ValueError, match='must be 0 or None'): raise ValueError("value must be 0 or None")
owith raises(ValueError, match=r'must be \d+$'): raise ValueError("value must be 42")
Hay dos formas de manejar este tipo de casos en pytest:
Usando la
pytest.raises
funciónUsando
pytest.mark.xfail
decoradorUso de
pytest.raises
:Uso de
pytest.mark.xfail
:Salida de
pytest.raises
:Salida de
pytest.xfail
marcador:Como dice la documentación :
fuente
xfail
No es la solución para el problema aquí, solo permite que la prueba falle. Aquí nos gustaría comprobar si se produce una cierta excepción.puedes probar
fuente
str(excinfo.value)
se requiere el uso. También funciona en pytest 4.x. En pytest 4.x,str(excinfo)
también funciona, pero no funciona en pytest 5.0.0.Pytest evoluciona constantemente y con uno de los cambios agradables en el pasado reciente, ahora es posible probar simultáneamente
Dos ejemplos de la documentación:
He estado usando ese enfoque en varios proyectos y me gusta mucho.
fuente
Se está utilizando la forma correcta,
pytest.raises
pero encontré una forma alternativa interesante en los comentarios aquí y quiero guardarla para futuros lectores de esta pregunta:fuente
Esta solución es lo que estamos usando:
Consulte pytest, https://docs.pytest.org/en/latest/reference.html#pytest-raises
fuente
Una mejor práctica será usar una clase que herede unittest.TestCase y ejecutar self.assertRaises.
Por ejemplo:
Entonces lo ejecutarías ejecutando:
fuente
pytest
es más popular quenosex
, pero así es como uso pytest.¿Has intentado eliminar "pytrace = True"?
¿Has intentado correr con '--fulltrace'?
fuente