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 assertpalavra-chave java (AssertionError), então é exatamente o mesmo assertTruee 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 assertThatou 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 assertinstrução integrada e, mais importante, não precisam ser ativadas explicitamente assert, ao contrário , que requer o -eaargumento JVM.
-eaestá 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";.
assertpode 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?
Assertexigiria mais clichê. assertsem 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.