web-dev-qa-db-fra.com

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

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

39
Eduardo Santa

JUnit fonctionne. Il n'y a aucune limitation qui le limite à des tests unitaires uniquement. Nous utilisons JUnit, Maven et CruiseControl pour faire CI.

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

17
Robin

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

Voici une approche qui fonctionne bien pour moi pour les applications qui utilisent http et les bases de données et je veux vérifier la pile entière:

  1. Utilisation Hypersonic or H2 en mode mémoire pour remplacer la base de données (cela fonctionne mieux pour les ORM)
  2. Initialisez la base de données dans @BeforeSuite ou équivalent (encore une fois: plus facile avec les ORM)
  3. Utilisez Jetty pour démarrer un serveur Web en cours.
  4. @Before chaque test, effacer la base de données et initialiser avec les données nécessaires
  5. Utilisez JWebUnit pour exécuter des requêtes HTTP vers Jetty

Cela vous donne des tests d'intégration qui peuvent s'exécuter sans aucune configuration de base de données ou de serveur d'applications et qui exercent la pile depuis http vers le bas. Comme il n'a pas de dépendances sur les ressources externes, ce test s'exécute correctement sur le serveur de génération.

Voici une partie du 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 sur les tests d'intégration embarquée avec Jetty et JWebUnit sur Java.net.

44
Johannes Brodwall

Lorsque j'utilise Maven pour construire un projet, j'ai eu un peu plus de chance avec TestNG car il a @BeforeSuite et @AfterSuite opérations. Ce qui est utile car Maven n'exécutera pas le "post-intégration-test" si l'un des tests d'intégration échoue. Ce n'est pas un problème avec Ant, donc j'utilise jUnit de préférence avec.

Dans les deux cas, la segmentation des tests comme le font TestNG et jUnit est également utile avec les tests d'intégration.

5
sblundy

Dans notre travail ici, notre solution de test d'intégration comprend trois parties principales:

  1. CruiseControl est le fondement de notre méthodologie d'intégration continue.
  2. Notre configuration CruiseControl lance une construction de test rapide dans les 3 minutes suivant l'enregistrement de quiconque à Subversion . Les tests qui se produisent ici sont "tout compile-t-il encore?" et "les tests unitaires réussissent-ils tous?". JUnit est évidemment le principal facilitateur pour répondre aux deuxièmes questions.
  3. Chaque heure, il lance une version plus large qui construit l'aide en ligne et les installateurs que nous utilisons sur nos différentes plates-formes de déploiement. Cette étape vérifie les questions plus importantes de "avons-nous toujours un produit déployable pour chacune de nos plateformes cibles?"

Le résultat final est que la plupart des gens ici ne se soucient jamais des tests d'intégration: cela se produit simplement. Les tests unitaires, en revanche, sont la priorité de tous. JUnit facilite la construction de tests, bien que de bons tests nécessitent toujours du temps de réflexion et de développement.

2
Bob Cross

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.

Test d'une servlet:

  • configurer le contexte et la configuration du servlet
  • faire les tests en utilisant des requêtes de servlet factices (Spring prend en charge cela, mais vous pouvez également utiliser EasyMock ou vos propres simulateurs)

Test d'une application à ressort:

  • utiliser AbstractDependencyInjectionSpringContextTests pour configurer le contexte
  • tester les haricots câblés
  • il existe également des sous-classes de AbstractDependencyInjectionSpringContextTests prenant en charge la gestion des transactions lors des tests avec une base de données.

Mais le pur Junit a sa limite. Le test des interfaces utilisateur est un cas typique. Vous pouvez utiliser Selenium pour les applications Web, soapui pour les services Web ou d'autres outils appropriés.

Mais quoi que vous utilisiez, il devrait être possible de l'intégrer dans votre construction continue (régulateur de vitesse, ville d'équipe ou autre).

1
Arne Burmeister

La suggestion dépend de votre application et de votre objectif.

J'ai écrit des tests d'intégration dans JUnit, mais j'ai également vu des gens utiliser HtmlUnit (extension JUnit), Selenium, Watir, Fit/Fitness et même des outils commerciaux comme WinRunner et Silk.

Parlez-nous donc un peu plus de votre domaine et des objectifs de vos tests et vous obtiendrez probablement une meilleure réponse.

0
Jeffrey Fredrick

Mise à jour pour 2012: Tandis que JUnit peut être utilisé (et bénéficie du support de CI), JWebUnit et Selenium semblent manger le mindshare pour les tests d'intégration.

0
8bitjunkie

Absolument! Nous utilisons une combinaison de tâches JUnit, ANT pour les exécuter et Hudson pour les tests d'intégration continue. Fonctionne comme un charme.

0
eishay

Il existe une très bonne extension pour JUnit appelée Jitr.

Jitr est un exécuteur de test d'intégration JUnit et il permet à vos tests d'intégration d'applications Web de s'exécuter facilement sur un conteneur Web léger dans la même machine virtuelle Java que vos tests.

Voir leur site pour plus de détails: http://www.jitr.org/

0
uthark

Je pense que les tests d'automatisation et d'intégration ne fonctionnent pas bien ensemble . Le problème très basique est la configuration de l'environnement avant chaque test. Le test de type d'intégration plus grande est nécessaire.

Mes réflexions sur l'automatisation des tests sur la couche d'intégration: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/

0
Dariusz Cieslak