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?
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?
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 mesmo assertTrue
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 usa assertThat
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.
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 explicitamente assert
, ao contrário , que requer o -ea
argumento JVM.
-ea
está sempre ativado mvn 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 em java.lang.AssertionError: expected:<1> but was:<2>
vs
assert(1 == 2);
resulta em java.lang.AssertionError
você pode obter ainda mais informações se adicionar o argumento da mensagem a assertEquals
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.
Eu diria que se você estiver usando JUnit, você deve usar as asserções JUnit. assertTrue()
é basicamente o mesmo que assert
, Caso contrário, por que usar JUnit?
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.