2008-11-12 16 views

Respuesta

12

JUnit funciona. No hay limitaciones que lo restrinjan a pruebas unitarias solamente. Usamos JUnit, Maven y CruiseControl para hacer CI.

Puede haber herramientas que sean específicas para las pruebas de integración, pero creo que su utilidad depende del tipo de componentes del sistema que está integrando. JUnit funcionará bien para pruebas de tipo no UI.

+1

con respecto a "No hay limitaciones que restringen a ser pruebas de unidad única," por favor ver http://stackoverflow.com/questions/3144887/passing-junit -data-between-tests. Algunas respuestas interesantes y sugerencias allí. – orbfish

0

Definitivamente! Utilizamos una combinación de tareas JUnit, ANT para ejecutarlas, y Hudson para pruebas de integración continuas. Funciona de maravilla.

5

Cuando uso Maven para construir un proyecto, he tenido un poco más de suerte con TestNG porque tiene operaciones @BeforeSuite y @AfterSuite. Que son útiles porque Maven no ejecutará la 'prueba de integración posterior' si falla cualquiera de las pruebas de integración. No es un problema con Ant, así que solo uso jUnit fuera de preferencia con él.

En cualquier caso, segmentar las pruebas como TestNG y jUnit también es útil con las pruebas de integración.

1

Sí, puede usar junit para las pruebas de integración, pero depende del tipo de prueba de integración que necesite.

Prueba de un servlet:

  • configurar el contexto de servlet y config
  • hacen las pruebas usando peticiones de servlets falsos (primavera tiene soporte para esto, pero también se puede utilizar EasyMock o sus propios simulacros)

Prueba de una aplicación de primavera:

  • uso AbstractDependencyInjectionSpringCon textTests para configurar el contexto
  • prueba de los beans cableados
  • También hay subclases de AbstractDependencyInjectionSpringContextTests que admiten la gestión de transacciones cuando se prueban con una base de datos.

Pero el junit puro tiene su límite. La prueba de las interfaces de usuario es un caso típico. Puede usar selenio para aplicaciones web, soapui para servicios web u otras herramientas apropiadas.

Pero sea lo que sea que use, debería ser posible integrarlo en su construcción continua (control de crucero, ciudad de equipo o lo que sea).

+0

Hola, ¿podría aconsejarme sobre dónde podría encontrar más información sobre el uso de Spring para simular un servlet? –

+1

@Ben: Spring tiene soporte para probar un servlet con clases de respuesta y solicitud de servlet falso, no para simular un servlet. –

2

En nuestro trabajo, nuestra solución de pruebas de integración tiene tres partes principales:

  1. CruiseControl es la base de nuestra metodología de integración continua.
  2. Nuestra configuración de CruiseControl inicia una construcción de prueba rápida dentro de los 3 minutos posteriores al registro de cualquier persona al Subversion. Las pruebas que ocurren aquí son "¿todo sigue compilando?" y "¿aún pasan las pruebas unitarias?". JUnit es obviamente el principal facilitador al responder las segundas preguntas.
  3. Cada hora, inicia una construcción más grande que construye la ayuda en línea y los instaladores que usamos en nuestras diversas plataformas de implementación. Este paso verifica las preguntas más importantes de "¿todavía tenemos un producto desplegable para cada una de nuestras plataformas de destino?"

El resultado final es que la mayoría de la gente aquí nunca se preocupa por las pruebas de integración: simplemente sucede. Las pruebas unitarias, por otro lado, son la prioridad de todos. JUnit hace que sea fácil construir pruebas, aunque buenas pruebas siempre requerirán tiempo de reflexión y desarrollo.

38

He usado JUnit para hacer muchas pruebas de integración. Las pruebas de integración pueden, por supuesto, significar muchas cosas diferentes. Para más pruebas de integración de nivel de sistema, prefiero dejar que las secuencias de comandos dirijan mi proceso de prueba desde el exterior.

He aquí un método que funciona bien para mí para aplicaciones que utilizan HTTP y bases de datos y quiero para verificar toda la pila:

  1. Uso Hypersonic or H2 en el modo en memoria como un reemplazo para la base de datos (esto funciona mejor para ORM)
  2. Inicialice la base de datos en @BeforeSuite o equivalente (de nuevo: más fácil con ORM)
  3. Use Jetty para iniciar un servidor web en proceso.
  4. @Before cada prueba, borrar la base de datos e inicializar los datos necesarios
  5. Use JWebUnit para ejecutar peticiones HTTP hacia el embarcadero

Esto le da pruebas de integración que puedan funcionar sin ningún tipo de configuración de base de datos o servidor de aplicaciones y que ejercita la pila desde http hacia abajo. Como no tiene dependencias con recursos externos, esta prueba funciona bien en el servidor de compilación.

Aquí una parte del código que utilizo:

@BeforeClass 
public static void startServer() throws Exception { 
    System.setProperty("hibernate.hbm2ddl.auto", "create"); 
    System.setProperty("hibernate.dialect", "..."); 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setJdbcUrl("jdbc:hsqldb:mem:mytest"); 
    new org.mortbay.jetty.plus.naming.Resource(
      "jdbc/primaryDs", dataSource); 


    Server server = new Server(0); 
    WebAppContext webAppContext = new WebAppContext("src/main/webapp", "/"); 
    server.addHandler(webAppContext); 
    server.start(); 
    webServerPort = server.getConnectors()[0].getLocalPort(); 
} 

// From JWebUnit 
private WebTestCase tester = new WebTestCase(); 

@Before 
public void createTestContext() { 
    tester.getTestContext().setBaseUrl("http://localhost:" + webServerPort + "/"); 
    dao.deleteAll(dao.find(Product.class)); 
    dao.flushChanges(); 
} 

@Test 
public void createNewProduct() throws Exception { 
    String productName = uniqueName("product"); 
    int price = 54222; 

    tester.beginAt("/products/new.html"); 
    tester.setTextField("productName", productName); 
    tester.setTextField("price", Integer.toString(price)); 
    tester.submit("Create"); 

    Collection<Product> products = dao.find(Product.class); 
    assertEquals(1, products.size()); 
    Product product = products.iterator().next(); 
    assertEquals(productName, product.getProductName()); 
    assertEquals(price, product.getPrice()); 
} 

Para aquellos que quieren saber más, he escrito un article about Embedded Integration Tests with Jetty and JWebUnit en Java.net.

+0

¿Qué es el campo "probador" en el código de ejemplo? – Nicolai

+0

Si está probando la integración con su base de datos, debe probar la integración con esa base de datos y no con un sustituto. Si está probando la integración con algún otro sistema, entonces tiene sentido usar una base de datos sustituta si eso disminuye las posibilidades de errores "falsos". – kc2001

+0

@ kc2001 Cierto, cuanto más realista sea su configuración de prueba, más podrá confiar en sus pruebas. Para mí, usar un DB sustituto se ha sentido suficiente (y es más rápido), pero usar el DB real daría más confianza. –

0

La sugerencia depende de su aplicación y su objetivo.

He escrito pruebas de integración en JUnit, pero también he visto personas usar HtmlUnit (extensión JUnit), Selenium, Watir, Fit/Fitness e incluso herramientas comerciales como WinRunner y Silk.

Cuéntanos un poco más acerca de tu dominio y los objetivos de tus pruebas y probablemente puedas obtener una mejor respuesta.

+0

Espero haber aclarado la pregunta. –

0

Hay una muy buena extensión para JUnit llamada Jitr.

Jitr es un JUnit Integration Test Runner y permite que las pruebas de integración de aplicaciones web se ejecuten fácilmente contra un contenedor web liviano en la misma JVM que sus pruebas.

ver a su sitio para más detalles: http://www.jitr.org/

0

Actualización para 2012: Mientras JUnit se puede utilizar (y se beneficia de apoyo CI) JWebUnit y selenio parecen estar comiendo el reconocimiento de marca para pruebas de integración.

-1

Creo que las pruebas de automatización e integración no funcionan bien juntas. El problema más básico es configuración de entorno antes de cada prueba. Cuanto más prueba de tipo de integración se necesita una configuración más grande.

Mis pensamientos sobre la automatización de pruebas sobre la capa de integración: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/

Cuestiones relacionadas