Testes de unidade

Testes de unidade

por Jorge Leandro -
Número de respostas: 5

Olás,

Falando sobre testes, pelo que entendi, para fazer testes de unidade é preciso criar uma classe de teste para cada classe do sistema.

Para chamar alguma pág JSP, o VRaptor emprega a convenção de usar um caminho do tipo:

/WEB-INF/jsp/nome_do_controller /

dentro do qual há uma pág JSP com o mesmo nome do método que a chama.

Por exemplo, se eu tenho uma classe MeuController com um método index() , a convenção do VRaptor define que pode existir a página a ser chamada index.jsp em /WEB-INF/jsp/meucontroller/

Minha pergunta é: fazendo um teste de unidade de MeuController, como testar que a página index.jsp realmente está sendo chamada?

É suficiente usar na classe MeuController algo do tipo (?):

@Path("/")

public boolean index() {

return true;

}

e na classe de teste com JUnit

@Test

public void deveriaChamarIndex() {

boolean result = bemvindoController.index();

assertTrue(result);

}

Isso garantiria apenas que o método index() está sendo chamado e não que a pág foi carregada, certo? Devo acreditar que o VRaptor está fazendo a parte dele e chamando a pág, caso ela exista ou alguém conhece uma forma melhor de testar esse método?

Abçs

JLeandro

Em resposta à Jorge Leandro

Re: Testes de unidade

por Felipe Torres -

Olá,

pelo que eu entendi, você quer fazer um teste para verificar se a página está sendo carregada corretamente em um determinado endereço (no caso localhost:8080/nome-do-projeto/ ), certo?

Esse tipo de teste é chamado "teste de integração" e não costuma ser feito com JUnit (pelo menos, eu nunca vi... =] ). Geralmente o pessoal usa o Selenium ou HtmlUnit.

"Isso garantiria apenas que o método index() está sendo chamado e não que a pág foi carregada, certo? "

Certo.

"Devo acreditar que o VRaptor está fazendo a parte dele e chamando a pág, caso ela exista (...)"

Não, pois você está testando apenas o comportamento do método e não sua interação com o browser.

Abraço!

Em resposta à Felipe Torres

Re: Testes de unidade

por Jorge Leandro -

Oi, Felipe

Parece que o autor deste exemplo conseguiu testar se a página está sendo chamada mesmo, usando só o JUnit, mas não ficou muito claro pra mim como ele conseguiu isto, veja:

http://yuriadamsmaia.wordpress.com/2011/08/05/com-vraptor-e-mockito-e-muito-mais-facil-testar/

Ele disponibiliza seu código aqui:

http://www.github.com/yuriadams

Note que em FilmeController ele tem o método:

    @Path("/filme")
    public void index(){
    }

, no FilmeControllerTeste ele tem o método:

    @Test
    public void deveriaAbrirTelaInicialDeFilmes(){
        filmeController.index();
        assertFalse("n‹o deveria haver erros!",    result.included().containsKey("erros"));
    }

e na pág index.jsp ele tem a linha (Expression Language ???):

<span id="erros">${erros}</span>

Vc enxerga como ele usa ${erros} em index.jsp e result.included().containsKey("erros")) em FilmesControllerTeste pra conseguir fazer esse teste?

Abç,

JLeandro



 

Em resposta à Jorge Leandro

Re: Testes de unidade

por Felipe Torres -
Opa,

na realidade, o método index() seria assim:

@Path("/")
public void index() {
try {
//sua lógica...
catch (Exception e) {
result.include("erros", e.getMessage());
}
}

Se houver alguma exception ao rodar a lógica, o cara insere a stacktrace no .jsp com o nome de "erros". (<span>${erros}</span>)
Isso é zoado, pois imagine que haja uma exception na sua lógica. Você estará inserindo a stacktrace inteira na página. =/
Nesse caso, seria melhor redirecionar para uma outra página do tipo "Houve um erro no sistema bla bla bla..."

Então, o seu teste verificaria se "erros" está (ou não) na sua página.
Isso é feito em
assertFalse("nao deveria haver erros!", result.included().containsKey("erros"));

Na boa, isso é meio gambiarra. Dá uma lida no Selenium ou HtmlUnit que são específicos para esse tipo de teste.
Abraço!