Creé un sistema web usando Java Servlets y ahora quiero hacer pruebas JUnit. MidataManager
es solo una pieza básica de código que lo envía a la base de datos. ¿Cómo probarías un Servlet con JUnit?
Mi ejemplo de código que permite a un usuario registrarse / registrarse, que se envía desde mi página principal a través de 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
fuente
fuente
En primer lugar, en una aplicación real, nunca obtendría información de conexión de base de datos en un servlet; lo configuraría en su servidor de aplicaciones.
Sin embargo, hay formas de probar Servlets sin tener un contenedor en ejecución. Uno es usar objetos simulados. Spring proporciona un conjunto de simulaciones muy útiles para cosas como HttpServletRequest, HttpServletResponse, HttpServletSession, etc.
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html
Con estos simulacros, puedes probar cosas como
¿Qué sucede si el nombre de usuario no está en la solicitud?
¿Qué sucede si el nombre de usuario está en la solicitud?
etc
Luego podrías hacer cosas como:
fuente
Encuentro que las pruebas de selenio son más útiles con pruebas de integración o funcionales (de un extremo a otro). Estoy tratando de usar org.springframework.mock.web , pero no estoy muy avanzado . Adjunto un controlador de muestra con un conjunto de pruebas jMock .
Primero, el controlador:
A continuación, la prueba:
Espero que esto ayude.
fuente
Actualizado en febrero de 2018: OpenBrace Limited ha cerrado y su producto ObMimic ya no es compatible.
Aquí hay otra alternativa, utilizando la biblioteca ObMimic de OpenBrace de pruebas dobles de API de Servlet (divulgación: soy su desarrollador).
Notas:
Cada "mimic" tiene un objeto "mimicState" para su estado lógico. Esto proporciona una clara distinción entre los métodos de API de Servlet y la configuración e inspección del estado interno de la mímica.
Es posible que se sorprenda de que la comprobación de Content-Type incluya "charset = ISO-8859-1". Sin embargo, para el código "doPost" dado, esto es según el Javadoc de la API de Servlet, y el método getContentType de HttpServletResponse, y el encabezado Content-Type real producido en, por ejemplo, Glassfish 3. Es posible que no se dé cuenta de esto si usa objetos simulados normales y su propias expectativas del comportamiento de la API. En este caso, probablemente no importe, pero en casos más complejos, este es el tipo de comportamiento de API imprevisto que puede hacer que las burlas se burlen un poco.
La he utilizado
response.getMimicState().getContentType()
como la forma más sencilla de verificar el tipo de contenido e ilustrar el punto anterior, pero de hecho podría verificar "texto / html" por sí solo si quisiera (usarresponse.getMimicState().getContentTypeMimeType()
). También funciona comprobar el encabezado Content-Type de la misma forma que el encabezado Cache-Control.Para este ejemplo, el contenido de la respuesta se verifica como datos de caracteres (con esto usando la codificación del escritor). También podríamos verificar que se usó el Writer de la respuesta en lugar de su OutputStream (usando
response.getMimicState().isWritingCharacterContent()
), pero he entendido que solo nos preocupa la salida resultante, y no nos importa qué llamadas API lo produjeron (aunque eso podría ser comprobado también ...). También es posible recuperar el contenido del cuerpo de la respuesta como bytes, examinar el estado detallado del Writer / OutputStream, etc.Hay detalles completos de ObMimic y una descarga gratuita en el sitio web de OpenBrace . O puede contactarme si tiene alguna pregunta (los datos de contacto están en el sitio web).
fuente
EDITAR : Cactus es ahora un proyecto muerto: http://attic.apache.org/projects/jakarta-cactus.html
Es posible que desee mirar cactus.
http://jakarta.apache.org/cactus/
fuente
Otro enfoque sería crear un servidor incrustado para "alojar" su servlet, permitiéndole escribir llamadas en él con bibliotecas destinadas a realizar llamadas a servidores reales (la utilidad de este enfoque depende en cierto modo de la facilidad con la que pueda hacer que la programación sea "legítima" llamadas al servidor: estaba probando un punto de acceso JMS (Java Messaging Service), para el cual abundan los clientes).
Hay un par de rutas diferentes a las que puede ir: las dos habituales son tomcat y jetty.
Advertencia: algo a tener en cuenta al elegir el servidor para incrustar es la versión de servlet-api que está utilizando (la biblioteca que proporciona clases como HttpServletRequest). Si está utilizando 2.5, encontré que Jetty 6.x funciona bien (que es el ejemplo que daré a continuación). Si está utilizando servlet-api 3.0, el material integrado de tomcat-7 parece ser una buena opción, sin embargo, tuve que abandonar mi intento de usarlo, ya que la aplicación que estaba probando usaba servlet-api 2.5. Intentar mezclar los dos resultará en NoSuchMethod y otras excepciones similares al intentar configurar o iniciar el servidor.
Puede configurar un servidor como este (Jetty 6.1.26, servlet-api 2.5):
fuente
Utilice Selenium para pruebas unitarias basadas en la web. Hay un complemento de Firefox llamado Selenium IDE que puede registrar acciones en la página web y exportar a casos de prueba JUnit que usa Selenium RC para ejecutar el servidor de prueba.
fuente
fuente
Primero, probablemente debería refactorizar esto un poco para que el DataManager no se cree en el código doPost. Debería probar Dependency Injection para obtener una instancia. (Vea el video de Guice para una buena introducción a DI). Si le dicen que comience a probar todo unitario, entonces DI es imprescindible.
Una vez que se inyectan sus dependencias, puede probar su clase de forma aislada.
Para probar el servlet, hay otros subprocesos más antiguos que han discutido esto ... intente aquí y aquí .
fuente