Framework do teste StrutsTestCase (Parte 2): Escrita de testes

Dezembro 2016


Veja a primeira parte da dica Framework do test StrutsTestCase (Parte 1): Apresentação

1. Escrita de testes


O framework StrutsTestCase oferece uma variedade de métodos de validação com base no framework Junit. Seus métodos são usados para escrever um caso de teste através de instruções básicas. Seus métodos são descritos na tabela abaixo.


Para explicar melhor como testar uma ação struts vamos ver um exemplo simples, mas prático, que ilustra o uso do StrutsTestCase .

Consideremos a seguinte classe LoginAction para verificar a autenticação de um usuário. Nesta classe você receberá um ActionForm com as informações do login. Em primeiro lugar, vamos tentar recuperar o nome de usuário e senha e verificar se estas informações são válidas. Se houver um erro nos valores do nome de usuário ou senha criaremos um ActionError onde especificaremos a chave da mensagem. E tentaremos fazer um forward para a tela de login, outra vez. No outro caso, onde as informações de login estão válidas, armazenaremos suas informações na sessão. Depois, tentaremos fazer um forward para a próxima tela.

public class LoginAction extends Action {  
 public ActionForward perform(ActionMapping mapping,  
   ActionForm form,  
   HttpServletRequest request,  
   HttpServletResponse response)  
 {  
  String username = ((LoginForm)form).getUsername();  
  String password = ((LoginForm)form).getPassword();  
  ActionErrors errors = new ActionErrors();  
  if ((!username.equals("dery")) || (!password.equals("radar")))  
  {  
   errors.add("password","error.password.mismatch");  
  }   
  if (!errors.empty())  
  {  
   saveErrors(request,errors);  
   return mapping.findForward("login");  
  }     
  //backup do nome do usuário na sessão  
  HttpSession sessão = request.getSession();  
  session.setAttribute("authentification", username);  
    
  //forward para o URI success  
  return mapping.findForward("success");  
 }  
}


Exemplo de teste

Nesta classe, podemos testar:
  • O bean LoginForm funciona corretamente: se inserirmos os parâmetros no "request", a instanciação do bean (feijão) é feita corretamente?
  • Se o nome de usuário ou senha não correspondem ao valor esperado recebe-se a lista de erros apropriados para exibir na tela seguinte? Consequentemente, há qualquer referência à página de login novamente?
  • Se fornecermos informações de login corretas, obteremos a boa página onde o foward aconteceu? Podemos estar seguros que não houve erros transmitidos? As informações de autenticação foi registradas corretamente na sessão?

StrutsTestCase testa todas estas condições com o framework Junit, como indicado abaixo.
  • Criação de uma classe de teste vazia que estende o CactusStrutsTestCase ou o MockStrutsTestCase.

 public class TestLoginAction extends CactusStrutsTestCase   
 {  
  public void setUp() {super.setUp();}  
   public void tearDown() {super.tearDown();}  
  public TestLoginAction (String testName)   
  {  
   super(testName);  
  }   
  public void testSucessfullLogin(){}    
 }
  • Especificação do mapeamento a ser usado no teste: para isso, basta especificar o path (caminho) associado com o mapeamento struts com o método "setRequestPathInfo". Por padrão, o Struts procura o caminho no arquivo de configuração WEB-INF/struts-config.xml. para especificar outro local, basta usar o método setConfigFile ().

public class TestLoginAction extends CactusStrutsTestCase {  
   
 public TestLoginAction (String testName)   
 {  
  super(testName);  
 }  
 public void testSucessfullLogin()  
 {  
  setRequestPathInfo("/login") ;  
 }    
}
  • Acréscimo das propriedades do formBean através do objeto request.

public class TestLoginAction extends CactusStrutsTestCase {  
   
 public TestLoginAction (String testName)   
 {  
  super(testName);  
 }  
 public void testSucessfullLogin()  
 {  
  setRequestPathInfo("/login") ;  
  addRequestParameter("username", "dery");  
  addRequestParameter("password", "radar");  
 }    
}
  • Execução da ação através do método actionPerform: o "request" será tratado pelo ActionServlet. Basta verificar se todo o processamento ocorreu como esperado.

public class TestLoginAction extends CactusStrutsTestCase {  
   
 public TestLoginAction (String testName)   
 {  
  super(testName);  
 }  
 public void testSucessfullLogin()  
 {  
  setRequestPathInfo("/login") ;  
  addRequestParameter("username", "dery");  
  addRequestParameter("password", "radar");  
  actionPerform();  
 }    
}
  • Verificar se o forward foi para o destino certo.

public class TestLoginAction extends CactusStrutsTestCase {  

 public TestLoginAction (String testName)   
 {  
  super(testName);  
 }    
 public void testSucessfullLogin()  
 {  
  setRequestPathInfo("/login") ;  
  addRequestParameter("username", "dery");  
  addRequestParameter("password", "radar");  
  actionPerform();  
  verifyForward("success");  
 }    

}
  • Verificar se as informações de autenticação foram registradas na sessão.

public class TestLoginAction extends CactusStrutsTestCase {  

   
 public TestLoginAction (String testName)   
 {  
  super(testName);  
 }  
 public void testSucessfullLogin()  
 {  
  setRequestPathInfo("/login") ;  
  addRequestParameter("username", "dery");  
  addRequestParameter("password", "radar");  
  actionPerform();  
  verifyForward("success");  
  assertEquals("dery", (String) getSession().getAttribute("authentification"));  
 }  
}
  • Verificar se mensagens ActionError foram retornadas. Isto é suficiente para testar se a autenticação está correta.

public class TestLoginAction extends CactusStrutsTestCase {  
   
 public TestLoginAction (String testName)   
 {  
  super(testName);  
 }  
 public void testSucessfullLogin()  
 {  
  setRequestPathInfo("/login") ;  
  addRequestParameter("username", "dery");  
  addRequestParameter("password", "radar");  
  actionPerform();  
  verifyForward("success");  
  assertEquals("dery", (String) getSession().getAttribute("authentification"));  
  verifyNoActionErrors();  
 }    
}
  • Teste em caso de falha na autenticação. Veja este exemplo:

public void testFailedLogin()  
{  
   
  setRequestPathInfo("/login");  
  addRequestParameter("username", "dery");  
  addRequestParameter("password", "error");  
  actionPerform();  
  verifyForward("login");  
  verifyActionErrors(new String[] {"error.password.mismatch"});  
  assertNull((String)getSession().getAttribute("authentification"));  
}

2.Best Practises durante a escrita das classes de testes cactus


Os desenvolvedores de testes cactus devem respeitar as seguintes regras:
  • Segurança do código: As classes d testes são codificados corretamente, elas não devem enfrentar elas mesmas o objeto testado. Essas classes são classes de auditoria, elas devem ser suficientemente seguras.
  • Relevância do código: As classes de testes devem testar as funcionalidades do aplicativo em detalhes para detectar o máximo de bugs.
  • Boa cobertura funcional: As classes de testes devem cobrir todos os detalhes dos "uses case" para detectar todas as anomalias potenciais em um determinado caso.
  • Escalabilidade das classes de teste: Em geral, as aplicações sofrem campanhas de "refactoring", isto deve ser acompanhado de uma atualização das classes de teste em paralelo, a fim de considerar a escalabilidade do código a ser testado.

3.Configuração do Cactus


Arquivo cactus.properties :
O arquivo cactus.properties contém os parâmetros necessários para a execução dos scripts ANT utilizados para a execução dos testes.
A propriedade cactus.servletRedirectorName indica o nome do servlet de redirecionamento cactus que deve ser definido no arquivo web.xml obrigatoriamente, assim:
<servlet>  
<servlet-name>StrutsServletRedirector</servlet-name>  
<servlet-class>  
org.apache.cactus.server.ServletTestRedirector  
</servlet-class>  
</servlet>  

<servlet-mapping>  
<servlet-name>StrutsServletRedirector</servlet-name>  
<url-pattern>/StrutsServletRedirector</url-pattern>  
</servlet-mapping>



Tradução feita por Lucia Maurity y Nouira

Veja também :
Este documento, intitulado « Framework do teste StrutsTestCase (Parte 2): Escrita de testes »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.