Quero escrever um teste para estabelecer que uma exceção não é gerada em uma determinada circunstância.
É simples testar se uma exceção é gerada ...
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
... mas como você pode fazer o oposto .
Algo assim, o que eu estou procurando ...
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
python
unit-testing
glaucon
fonte
fonte
assertNotRaises
método que compartilha 90% de seu código / comportamentoassertRaises
em cerca de ~ 30 linhas de código. Veja minha resposta abaixo para obter detalhes.hypothesis
para garantir que elas produzam a mesma saída para todos os tipos de entrada, ignorando os casos em que o original gera uma exceção.assume(func(a))
não funciona porque a saída pode ser uma matriz com um valor de verdade ambíguo. Então, eu só quero chamar uma função e obterTrue
se ela não falhar.assume(func(a) is not None)
funciona eu achoRespostas:
fonte
ValueError
, masValueError
for aumentado, seu teste deverá sair com uma condição de falha, não com erro. Por outro lado, se executando o mesmo código, você geraria umKeyError
, isso seria um erro, não uma falha. Em python - diferentemente de outras linguagens - as exceções são rotineiramente usadas para o fluxo de controle, é por isso que temos aexcept <ExceptionName>
sintaxe de fato. A esse respeito, a solução do user9876 está simplesmente errada.Essa é a suposição padrão - exceções não são levantadas.
Se você não disser mais nada, isso é assumido em todos os testes.
Você não precisa escrever uma afirmação para isso.
fonte
Basta chamar a função. Se houver uma exceção, a estrutura de teste da unidade sinalizará isso como um erro. Você pode adicionar um comentário, por exemplo:
fonte
xfail
decorador em pytest.Sou o pôster original e aceitei a resposta acima pela DGH sem antes usá-la no código.
Uma vez que eu usei, percebi que precisava de alguns ajustes para realmente fazer o que eu precisava (para ser justo com a DGH, ele / ela disse "ou algo semelhante"!).
Eu pensei que valia a pena postar o tweak aqui para o benefício de outros:
O que eu estava tentando fazer aqui era garantir que, se fosse feita uma tentativa de instanciar um objeto Application com um segundo argumento de espaços, o pySourceAidExceptions.PathIsNotAValidOne seria gerado.
Acredito que o uso do código acima (baseado fortemente na resposta da DGH) fará isso.
fonte
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
deve fazer o trabalho neste caso.Você pode definir
assertNotRaises
reutilizando cerca de 90% da implementação originalassertRaises
nounittest
módulo. Com essa abordagem, você acaba com umassertNotRaises
método que, além da condição de falha reversa, se comporta de maneira idênticaassertRaises
.TLDR e demonstração ao vivo
É surpreendentemente fácil adicionar um
assertNotRaises
métodounittest.TestCase
(levei cerca de 4 vezes mais tempo para escrever essa resposta do que o código). Aqui está uma demonstração ao vivo doassertNotRaises
método em ação . Assim comoassertRaises
, você pode passar um call e args paraassertNotRaises
, ou você pode usá-lo em umawith
declaração. A demonstração ao vivo inclui casos de teste que demonstram queassertNotRaises
funcionam conforme o esperado.Detalhes
A implementação de
assertRaises
inunittest
é bastante complicada, mas com uma subclasse inteligente, você pode substituir e reverter sua condição de falha.assertRaises
é um método curto que basicamente apenas cria uma instância daunittest.case._AssertRaisesContext
classe e a retorna (veja sua definição nounittest.case
módulo). Você pode definir sua própria_AssertNotRaisesContext
classe subclassificando_AssertRaisesContext
e substituindo seu__exit__
método:Normalmente você define classes de caso de teste, herdando-as de
TestCase
. Se você herdar de uma subclasseMyTestCase
:todos os seus casos de teste agora terão o
assertNotRaises
método disponível para eles.fonte
traceback
suaelse
declaração?import
. Sua fixapode ser modificado se você precisar aceitar parâmetros.
ligue como
fonte
Eu achei útil fazer o patch do macaco da
unittest
seguinte maneira:Isso esclarece a intenção ao testar a ausência de uma exceção:
Isso também simplifica o teste em um loop, o que muitas vezes me vejo fazendo:
fonte
assertMayRaise
aunittest.TestSuite
você pode apenas fingir que é parte daunittest
biblioteca.Se você passar uma classe Exception
assertRaises()
, é fornecido um gerenciador de contexto. Isso pode melhorar a legibilidade de seus testes:Isso permite testar casos de erro no seu código.
Nesse caso, você está testando o
PathIsNotAValidOne
aumento quando passa parâmetros inválidos para o construtor de aplicativos.fonte
você pode tentar assim. try: self.assertRaises (None, function, arg1, arg2), exceto: pass se você não colocar o código dentro do bloco try, ele passará pela exceção 'AssertionError: None not raise' e o caso de teste falhará. O caso de teste será aprovado se colocado dentro do bloco try, que é o comportamento esperado.
fonte
Uma maneira direta de garantir que o objeto seja inicializado sem nenhum erro é testar a instância de tipo do objeto.
Aqui está um exemplo :
fonte