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)
Resultado:
================================ 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 ==============================
Como fazer o rastreio de impressão pytest, para ver onde na whatever
função uma exceção foi gerada?
python
unit-testing
testing
pytest
Gill Bates
fonte
fonte
Respostas:
pytest.raises(Exception)
é o que você precisa.Código
Resultado
Observe que
e_info
salva o objeto de exceção para que você possa extrair detalhes dele. Por exemplo, se você deseja verificar a pilha de chamadas de exceção ou outra exceção aninhada dentro.fonte
e_info
. Para desenvolvedores mais familiarizados com outros idiomas, não é óbvio que o escopoe_info
se estenda para fora dowith
bloco.Você quer dizer algo como isto:
fonte
excinfo.value.message
não funcionou para mim, tive que usarstr(excinfo.value)
, adicionou uma nova resposta #assert excinfo.value.args[0] == 'some info'
é a forma direta de acesso a mensagemassert excinfo.match(r"^some info$")
funciona bem3.1
você pode usar o argumento keywordmatch
para afirmar que a exceção corresponde a um texto ou regex: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")
Existem duas maneiras de lidar com esse tipo de caso no pytest:
Usando a
pytest.raises
funçãoUsando
pytest.mark.xfail
decoradorUso de
pytest.raises
:Uso de
pytest.mark.xfail
:Saída de
pytest.raises
:Saída do
pytest.xfail
marcador:Como a documentação diz:
fonte
xfail
não é a solução para o problema aqui, apenas permite que o teste falhe. Aqui gostaríamos de verificar se uma certa exceção é gerada.podes tentar
fonte
str(excinfo.value)
é necessário usar . Também funciona no pytest 4.x. No pytest 4.x,str(excinfo)
também funciona, mas não no pytest 5.0.0.O pytest evolui constantemente e com uma das boas mudanças no passado recente agora é possível testar simultaneamente
Dois exemplos da documentação:
Eu tenho usado essa abordagem em vários projetos e gosto muito dela.
fonte
O caminho certo está usando,
pytest.raises
mas eu achei um caminho alternativo interessante nos comentários aqui e quero salvá-lo para futuros leitores desta pergunta:fonte
Esta solução é o que estamos usando:
Consulte pytest, https://docs.pytest.org/en/latest/reference.html#pytest-raises
fonte
A melhor prática será usar uma classe que herda unittest.TestCase e executar self.assertRaises.
Por exemplo:
Então você o executaria executando:
fonte
pytest
é mais popular quenosex
, mas é assim que eu uso o pytest.Você já tentou remover "pytrace = True"?
Você já tentou rodar com '--fulltrace'?
fonte