Code:
# coding=utf-8
import pytest
def whatever():
return 9/0
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
pytest.fail(exc, pytrace=True)
Production:
================================ 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 ==============================
Comment faire pytest print traceback, donc je verrais où dans la whatever
fonction une exception a été levée?
python
unit-testing
testing
pytest
Gill Bates
la source
la source
Réponses:
pytest.raises(Exception)
est ce dont vous avez besoin.Code
Production
Notez que
e_info
enregistre l'objet d'exception afin que vous puissiez en extraire des détails. Par exemple, si vous souhaitez vérifier la pile d'appels d'exception ou une autre exception imbriquée à l'intérieur.la source
e_info
. Pour les développeurs plus familiers avec certains autres langages, il n'est pas évident que la portée dee_info
s'étende en dehors duwith
bloc.Voulez-vous dire quelque chose comme ça:
la source
excinfo.value.message
n'a pas fonctionné pour moi, a dû utiliserstr(excinfo.value)
, a ajouté une nouvelle réponseassert excinfo.value.args[0] == 'some info'
est le moyen direct d'accéder au messageassert excinfo.match(r"^some info$")
fonctionne aussi3.1
vous pouvez utiliser l'argument mot-clématch
pour affirmer que l'exception correspond à un texte ou à une expression régulière:with raises(ValueError, match='must be 0 or None'): raise ValueError("value must be 0 or None")
ouwith raises(ValueError, match=r'must be \d+$'): raise ValueError("value must be 42")
Il existe deux façons de gérer ce type de cas dans pytest:
Utilisation de la
pytest.raises
fonctionUtiliser le
pytest.mark.xfail
décorateurUtilisation de
pytest.raises
:Utilisation de
pytest.mark.xfail
:Sortie de
pytest.raises
:Sortie du
pytest.xfail
marqueur:Comme le dit la documentation :
la source
xfail
n'est pas la solution au problème ici, il permet simplement au test d'échouer. Ici, nous aimerions vérifier si une certaine exception est levée.tu peux essayer
la source
str(excinfo.value)
est requise. Il fonctionne également dans pytest 4.x. Dans pytest 4.x,str(excinfo)
fonctionne également, mais ne fonctionne pas dans pytest 5.0.0.pytest évolue constamment et avec l'un des changements intéressants du passé récent, il est maintenant possible de tester simultanément
Deux exemples de la documentation:
J'ai utilisé cette approche dans un certain nombre de projets et j'aime beaucoup.
la source
La bonne façon est d'utiliser,
pytest.raises
mais j'ai trouvé une alternative intéressante dans les commentaires ici et je veux l'enregistrer pour les futurs lecteurs de cette question:la source
Cette solution est ce que nous utilisons:
Veuillez vous référer à pytest, https://docs.pytest.org/en/latest/reference.html#pytest-raises
la source
Une meilleure pratique consistera à utiliser une classe qui hérite d'unittest.TestCase et à exécuter self.assertRaises.
Par exemple:
Ensuite, vous l'exécuteriez en exécutant:
la source
pytest
est plus populaire quenosex
, mais voici comment j'utilise pytest.Avez-vous essayé de supprimer "pytrace = True"?
Avez-vous essayé de courir avec '--fulltrace'?
la source