Hoje eu vi um caso de teste JUnit com uma asserção java em vez das asserções JUnit - há vantagens ou desvantagens significativas em preferir um ao outro?
java
junit
assert
assertions
Robert
fonte
fonte
Respostas:
No JUnit4, a exceção (na verdade, Error) lançada por uma declaração JUnit é igual ao erro lançado pela
assert
palavra-chave java (AssertionError), então é exatamente o mesmoassertTrue
e diferente do rastreamento de pilha, você não poderia dizer a diferença.Dito isso, os asserts precisam ser executados com um sinalizador especial na JVM, fazendo com que muitos testes pareçam passar apenas porque alguém se esqueceu de configurar o sistema com aquele sinalizador quando os testes JUnit foram executados - não é bom.
Em geral, por causa disso, eu diria que usar o JUnit
assertTrue
é a melhor prática, porque garante que o teste seja executado, garante consistência (você às vezes usaassertThat
ou outras afirmações que não são uma palavra-chave java) e se o comportamento da JUnit afirma deve mudar no futuro (como enganchar em algum tipo de filtro ou outro recurso JUnit futuro) seu código será capaz de aproveitar isso.O propósito real da palavra-chave assert em java é ser capaz de desligá-la sem penalidade de tempo de execução. Isso não se aplica a testes de unidade.
fonte
Eu prefiro asserções JUnit, pois elas oferecem uma API mais rica do que a
assert
instrução integrada e, mais importante, não precisam ser ativadas explicitamenteassert
, ao contrário , que requer o-ea
argumento JVM.fonte
-ea
está sempre ativadomvn test
, não há necessidade de-ea
. Api mais rico, boa pegada. Às vezes acho que a API é mal utilizada no teste porque não faz parte do aplicativo (a in api), prefiro chamá-la apenas de métodos mais ricos.Quando um teste falha, você obtém mais informações.
assertEquals(1, 2);
resulta emjava.lang.AssertionError: expected:<1> but was:<2>
vs
assert(1 == 2);
resulta emjava.lang.AssertionError
você pode obter ainda mais informações se adicionar o argumento da mensagem a
assertEquals
fonte
assert 1==2: "1 is not 2";
.assert
pode ser preferível - para verificações de exatidão que afetariam o desempenho e, portanto, são melhor desativadas por padrão. No entanto, minha experiência é que a maioria das afirmações deve estar sempre ativa.Eu diria que use declarações JUnit em casos de teste e use declarações de java no código. Em outras palavras, o código real nunca deve ter dependências JUnit, como é óbvio, e se for um teste, ele deve usar as variações JUnit dele, nunca o assert.
fonte
Eu diria que se você estiver usando JUnit, você deve usar as asserções JUnit.
assertTrue()
é basicamente o mesmo queassert
, Caso contrário, por que usar JUnit?fonte
Assert
exigiria mais clichê.assert
sem o JUnit, seria necessário escrever uma estrutura inteira.Isso pode não se aplicar se você usar exclusivamente coisas brilhantes e novas, mas o assert não foi introduzido no Java até 1.4SE. Portanto, se você precisa trabalhar em um ambiente com tecnologia mais antiga, você pode optar pelo JUnit por motivos de compatibilidade.
fonte