Eu criei um sistema web usando Java Servlets e agora quero fazer o teste JUnit. My dataManager
é apenas um código básico que o envia ao banco de dados. Como você testaria um Servlet com JUnit?
Meu exemplo de código que permite a um usuário se registrar / inscrever, que é enviado da minha página principal via AJAX:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// Get parameters
String userName = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
try {
// Load the database driver
Class.forName("com.mysql.jdbc.Driver");
//pass reg details to datamanager
dataManager = new DataManager();
//store result as string
String result = dataManager.register(userName, password, name);
//set response to html + no cache
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
//send response with register result
response.getWriter().write(result);
} catch(Exception e){
System.out.println("Exception is :" + e);
}
}
unit-testing
testing
servlets
junit
Lunar
fonte
fonte
Em primeiro lugar, em um aplicativo real, você nunca obteria informações de conexão de banco de dados em um servlet; você o configuraria em seu servidor de aplicativos.
Existem maneiras, no entanto, de testar Servlets sem ter um contêiner em execução. Uma é usar objetos fictícios. O Spring fornece um conjunto de simulações muito úteis para coisas como HttpServletRequest, HttpServletResponse, HttpServletSession, etc:
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html
Usando esses mocks, você pode testar coisas como
O que acontece se o nome de usuário não estiver na solicitação?
O que acontece se o nome de usuário estiver na solicitação?
etc
Você poderia então fazer coisas como:
fonte
Acho que os testes Selenium são mais úteis com integração ou teste funcional (ponta a ponta). Estou tentando usar org.springframework.mock.web , mas não estou muito longe. Estou anexando um controlador de amostra a um conjunto de testes jMock .
Primeiro, o Controlador:
A seguir, o teste:
Espero que isso possa ajudar.
fonte
Atualizado em fevereiro de 2018: OpenBrace Limited foi fechado e seu produto ObMimic não é mais compatível.
Aqui está outra alternativa, usando a biblioteca ObMimic da API Servlet do OpenBrace (revelação: sou o desenvolvedor).
Notas:
Cada "mimic" tem um objeto "mimicState" para seu estado lógico. Isso fornece uma distinção clara entre os métodos da API do Servlet e a configuração e inspeção do estado interno do mímico.
Você pode se surpreender ao saber que a verificação de Content-Type inclui "charset = ISO-8859-1". No entanto, para o código "doPost" fornecido, é de acordo com o Javadoc da API Servlet e o método getContentType do próprio HttpServletResponse e o cabeçalho Content-Type real produzido, por exemplo, no Glassfish 3. Você pode não perceber isso se estiver usando objetos fictícios normais e seu próprias expectativas do comportamento da API. Nesse caso, provavelmente não importa, mas em casos mais complexos, esse é o tipo de comportamento imprevisto da API que pode zombar um pouco!
Eu usei
response.getMimicState().getContentType()
como a maneira mais simples de verificar o Content-Type e ilustrar o ponto acima, mas você poderia verificar se há "text / html" por conta própria se quiser (usandoresponse.getMimicState().getContentTypeMimeType()
). Verificar o cabeçalho Content-Type da mesma maneira que o cabeçalho Cache-Control também funciona.Neste exemplo, o conteúdo da resposta é verificado como dados de caractere (com isso usando a codificação do Escritor). Também poderíamos verificar se o Writer da resposta foi usado em vez de seu OutputStream (usando
response.getMimicState().isWritingCharacterContent()
), mas percebi que estamos apenas preocupados com a saída resultante e não nos importamos com quais chamadas de API a produziram (embora isso possa ser verificado também ...). Também é possível recuperar o conteúdo do corpo da resposta como bytes, examinar o estado detalhado do Writer / OutputStream etc.Há detalhes completos do ObMimic e um download gratuito no site do OpenBrace . Ou você pode entrar em contato comigo se tiver alguma dúvida (os dados para contato estão no site).
fonte
EDITAR : Cactus agora é um projeto morto: http://attic.apache.org/projects/jakarta-cactus.html
Você pode querer olhar para o cacto.
http://jakarta.apache.org/cactus/
fonte
Outra abordagem seria criar um servidor embutido para "hospedar" seu servlet, permitindo que você escreva chamadas nele com bibliotecas destinadas a fazer chamadas para servidores reais (a utilidade desta abordagem depende de quão facilmente você pode tornar programático "legítimo" chamadas para o servidor - eu estava testando um ponto de acesso JMS (Java Messaging Service), para o qual clientes abundam).
Existem duas rotas diferentes que você pode seguir - as duas usuais são tomcat e jetty.
Aviso: algo para se ter em mente ao escolher o servidor a incorporar é a versão da servlet-api que você está usando (a biblioteca que fornece classes como HttpServletRequest). Se você estiver usando 2.5, descobri que o Jetty 6.x funciona bem (que é o exemplo que darei a seguir). Se você estiver usando servlet-api 3.0, o material embarcado tomcat-7 parece ser uma boa opção, no entanto, tive que abandonar minha tentativa de usá-lo, pois o aplicativo que estava testando usava servlet-api 2.5. Tentar misturar os dois resultará em NoSuchMethod e outras exceções ao tentar configurar ou iniciar o servidor.
Você pode configurar um servidor como este (Jetty 6.1.26, servlet-api 2.5):
fonte
Use Selenium para testes de unidade baseados na web. Há um plugin do Firefox chamado Selenium IDE que pode gravar ações na página da web e exportar para casos de teste JUnit que usa Selenium RC para executar o servidor de teste.
fonte
fonte
Primeiro, você provavelmente deve refatorar isso um pouco para que o DataManager não seja criado no código doPost. Você deve tentar a injeção de dependência para obter uma instância. (Veja o Guice vídeo para uma boa introdução ao DI.). Se você está sendo instruído a começar o teste de unidade de tudo, o DI é essencial.
Depois que suas dependências forem injetadas, você pode testar sua classe isoladamente.
Para realmente testar o servlet, existem outros threads mais antigos que discutiram isso .. tente aqui e aqui .
fonte