Não use assertTrue para validar textos

Introdução

É comum, principalmente nos testes funcionais em qualquer front-end (web, mobile, desktop) incluirmos a validação de textos que são retornos ao usuário. Estas validações são decorrentes de falhas do usuário ou mesmo informação de que ação executada obteve sucesso.

Porém é comum ver que muitos profissionais usam o comando assertTrue ao invés do assertEquals na validação de textos. E eu vou te mostrar porque isso é ruim!

Diferenças entre assertTrue e assertEquals

Estes são comandos presentes em frameworks de teste unitário em linguagens orientadas a objetos, como Java e .NET.

Detalhes do assertEquals

O assertEquals vai garantir que um resultado esperado é igual ao resultado obtido.

Ele serve para comparar a igualdade de diferente tipos de dados como números, textos e objetos.

A sintaxe do assertEquals é a seguinte:

assertEquals(resultadoEsperado, resultadoObtido);

Logo o primeiro parâmetro é o resultado que esperamos e o segundo parâmetro será o resultado obtido virá da interface gráfica (da obtenção do texto de algum elemento).

O código abaixo mostra o exemplo com resultado esperado e obtido diferente um do outro:

String resultadoObtido = "Registro removido com sucesso!";

assertEquals("Registro deletado com sucesso!", resultadoObtido);

Note que a diferença é entre as palavras removido e deletado. A execução, quando ocorrer, será com falha mostrando a seguinte informação:

org.junit.ComparisonFailure: 
Expected :Registro deletado com sucesso!
Actual   :Registro removido com sucesso!

Na linha 1 é apresentado o tipo do problema, que é um erro de comparação (ComparisonFailure).
Na linha 2 é apresentado o resultado esperado.
Na linha 3 é apresentado o resultado obtido.

Com o uso do assertEquals fica muito mais fácil saber qual o problema a a diferença entre os resultados esperados versus os resultados obtidos.

Detalhes do assertTrue

O assertTrue vai garantir que o resultado esperado é verdadeiro. Caso ele seja falso um erro é apresentado.

A forma correta da utilização do assertTrue é a seguinte:

boolean possuiRestricao = true;

assertTrue(possuiRestricao);

Caso o valor da variável possuiRestricao seja false, você terá a seguinte saída de erro:

java.lang.AssertionError
	at org.junit.Assert.fail(Assert.java:86)
	at org.junit.Assert.assertTrue(Assert.java:41)
	at org.junit.Assert.assertTrue(Assert.java:52)

Vocês conseguiram, facilmente, identificar o problema?
Eu não consegui…

Nós até podemos inferir onde o problema foi gerado, mas somente neste caso que temos apenas uma validação. E nos casos onde temos diversas?

A forma errada que alguns fazem…

Vou iniciar falando que eu acredito que esta seja a forma errado por eu não ter um resultado que me diga/evidencie rapidamente o problema para que eu possa entende-lo ou tomar uma ação de imediato (corrigir o teste, abrir um bug, etc…)

String nome = "Elias Nogueira";
String cidade = "São Paulo";
String profissao = "Testador";
String anosExperiencia = "20 anos";

assertTrue(nome.equals("Elias Nogueira"));
assertTrue(cidade.equals("São Paulo"));
assertTrue(profissao.equals("Software Engineer in Test"));
assertTrue(anosExperiencia.equals("20 anos"));

Se eu executasse um script de teste com o código acima o erro seria (o mesmo explicado anteriormente):

java.lang.AssertionError
	at org.junit.Assert.fail(Assert.java:86)
	at org.junit.Assert.assertTrue(Assert.java:41)
	at org.junit.Assert.assertTrue(Assert.java:52)

Se você não estivesse vendo o código como estamos vendo agora e se deparasse com esse erro, certamente demoraria até entender qual foi o real problema (que é a diferença de igualdade na profissão).

Como seria a forma correta…

Se o código de testes utilizasse o assertEquals (recomendado), teríamos o seguinte exemplo:

String nome = "Elias Nogueira";
String cidade = "São Paulo";
String profissao = "Testador";
String anosExperiencia = "5 anos";

assertEquals("Elias Nogueira", nome);
assertEquals("São Paulo", cidade);
assertEquals("Software Engineer in Test", profissao);
assertEquals("20 anos", anosExperiencia);

Este teste também falhará, mas notem como o erro será apresentado:

org.junit.ComparisonFailure: 
Expected :Software Engineer in Test
Actual   :Testador

Não ficou mais fácil entender que tivemos um problema na comparação do resultado esperado versus o resultado obtido para a profissão?

Conclusão

Aprendemos a diferença entre assertTrue e assertEquals e como os resultados apresentados, em caso de falha, apresentam diferentes informações sendo o assertTrue menos e assertEquals mais.

E que para ter realmente uma informação mais clara do erro na validação de resultados de texto o assertEquals é o recomendado.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *