JUnit - usando o Assert errada
-
05-07-2019 - |
Pergunta
cito este post de entrada de exubero. Eu acho que esta entrada vai beneficiar a todos que está fazendo um teste de unidade:
Há um grande número de diferentes métodos começando com assert definido na classe Assert do JUnit. Cada um destes métodos tem um pouco diferentes argumentos e semântica sobre o que eles estão afirmando.
A seguir mostra alguns usos irregulares de assertTrue:
assertTrue("Objects must be the same", expected == actual);
assertTrue("Objects must be equal", expected.equals(actual));
assertTrue("Object must be null", actual == null);
assertTrue("Object must not be null", actual != null);
Alguns testes unitários especialistas apontam que o código acima poderia ser escrito melhor como:
assertSame("Objects must be the same", expected, actual);
assertEquals("Objects must be equal", expected, actual);
assertNull("Object must be null", actual);
assertNotNull("Object must not be null", actual);
Uma das vantagens de usar o apropriado 'assertXXX ()' vai aumentar a legibilidade do teste de unidade. Pode apontar ninguém o que outro benefício de usar o apropriado 'assertXXX ()'?
Solução
Eu não sou um desenvolvedor Java e eu não sei o que JUnit saídas quando uma afirmação falhar. Muitas estruturas de teste de unidade que eu tenho usado informações melhor saída de erro ao usar algo como assertEquals.
Deixe-me mostrar-lhe um exemplo do que estou falando:
assertTrue("Objects must be equal", "One" == "Two");
assertEquals("Objects must be equal", "One", "Two");
No primeiro caso, você pode ter uma saída de erro como este:
Erro: Esperado verdade real foi false
.Saída para o segundo caso:
Erro:. Exected "One" real era "Two"
Como você pode ver o segundo caso dá melhor informação mais significativa.
Outras dicas
Além do que @Vadim daid acima, usando o assert adequada pode proteger contra insetos criados por cut-copy-paste de testes.
Por exemplo
assertTrue("Objects must not be the same", expected != actual);
é então copiado e modificado para
assertTrue("Objects must not be the same", newobject == actual);
Quando as alterações de código e este teste falhar eo comentário engana o próximo desenvolvedor para "consertar" o código de uma forma que introduz um novo bug.
Se o cut-copy-paste-código era algo como isto:
assertFalse("Objects must be the same", newobject == actual);
O dis-congruência do comentário, a afirmação e o caso de teste pode ser mais perceptível.
E sim, eu já vi isso acontecer.