39 votes

Pouvons-nous utiliser JUNIT pour les tests d'intégration automatisés?

Comment automatiser les tests d'intégration ? J'utilise JUnit pour certains de ces tests. C'est l'une des solutions ou est totalement faux? Que suggérez-vous?

44voto

Johannes Brodwall Points 3469

J'ai utilisé JUnit pour faire beaucoup de tests d'intégration. Les tests d'intégration peut, bien sûr, signifie beaucoup de choses différentes. Pour plus de niveau de système de tests d'intégration, je préfère laisser les scripts lecteur de mon processus de test de l'extérieur.

Voici une approche qui fonctionne bien pour moi pour les applications qui utilisent le protocole http et les bases de données et je veux vérifier l'ensemble de la pile:

  1. Utiliser Hypersonic or H2 dans l'en-mode mémoire comme un remplacement pour la base de données (ce qui fonctionne le mieux pour Orm)
  2. Initialiser la base de données en @BeforeSuite ou l'équivalent (encore une fois: plus facile avec Orm)
  3. L'utilisation de la Jetée pour démarrer un processus de serveur web.
  4. @Before chaque test, effacer la base de données et d'initialiser les données nécessaires
  5. Utiliser JWebUnit d'exécuter des requêtes HTTP vers la Jetée

Cela vous donne tests d'intégration qui peut fonctionner sans aucune configuration de base de données ou un serveur d'application et que les exercices de la pile de http vers le bas. Depuis, il n'a pas de dépendances sur des ressources externes, ce test se passe bien sur le serveur de build.

Ici le code que j'utilise:

@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());
}

Pour ceux qui voudraient en savoir plus, j'ai écrit un article à propos de l'Intégration des Tests avec ponton et JWebUnit sur Java.net.

17voto

Robin Points 15032

JUnit fonctionne. Il n'y a pas de limitation qui le limite à n'être que des tests unitaires. Nous utilisons JUnit, Maven et CruiseControl pour effectuer la CI.

Il existe peut-être des outils spécifiques pour les tests d'intégration, mais je pense que leur utilité dépend du type de composants système que vous intégrez. JUnit fonctionnera correctement pour les tests de type non UI.

5voto

sblundy Points 27163

Lors de l'utilisation de Maven pour construire un projet, j'ai eu un peu plus de chance avec TestNG , car il a @BeforeSuite et @AfterSuite des opérations. Qui sont utiles parce que Maven ne va pas exécuter le "post-integration-test" si l'un des tests d'intégration de l'échec. Pas un problème avec les Fourmis, donc je viens de l'utiliser jUnit de préférence avec elle.

Dans les deux cas, la segmentation des essais comme les deux TestNG et jUnit n'est utile avec les tests d'intégration trop.

2voto

Bob Cross Points 13552

Dans notre travail, nos tests d'intégration de la solution dispose de trois grandes parties:

  1. CruiseControl est le fondement de notre intégration continue de la méthodologie.
  2. Notre CruiseControl configuration coup d'envoi à un rapide test de bâtir dans un délai de 3 minutes de n'importe qui d'archivage à la Subversion. Les tests qui arrivent ici sont "fait tout toujours compiler?" et "faire l'unité de tous les tests passent encore?". JUnit est évidemment le facilitateur majeur dans la réponse à la deuxième questions.
  3. Toutes les heures, coup d'envoi à un plus construire que des constructions de l'aide en ligne et les installateurs que nous utilisons sur nos différentes plates-formes de déploiement. Cette étape permet de vérifier les grandes questions de "ce que nous avons toujours une image de produit pour chacune de nos plateformes cibles?"

Le résultat final est que la plupart des gens ici, ne vous inquiétez au sujet des tests d'intégration: il se trouve. Les tests unitaires, d'autre part, tout le monde est sa priorité. JUnit rend facile de construire des tests, mais bon les tests auront toujours besoin de la pensée et de temps de développement.

1voto

Arne Burmeister Points 8423

Oui, vous pouvez utiliser junit pour les tests d'intégration, mais cela dépend du type de test d'intégration dont vous avez besoin.

Essai d'une servlet:

  • configuration de la servlet contexte et config
  • faire les tests à l'aide de maquette servlet demandes (Printemps a l'appui de ceci, mais vous pouvez également utiliser EasyMock ou de votre propre simulacres)

Le test d'un printemps de l'application:

  • utilisation AbstractDependencyInjectionSpringcontexttests pour configurer le contexte
  • test de la connexion filaire haricots
  • il y a aussi des sous-classes de AbstractDependencyInjectionSpringcontexttests appui de la gestion des transactions lors de l'essai avec une base de données.

Mais pur Junit a ses limites. Les tests des interfaces utilisateur est un cas typique. Vous pouvez utiliser le sélénium pour les applications web, soapui pour les services web ou d'autres moyens appropriés.

Mais tout ce que vous utilisez, il devrait être possible de l'intégrer dans votre durée de construire (régulateur de vitesse, l'équipe de la ville ou de quoi que ce soit).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X