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?
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.
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:
Hypersonic or H2
en mode mémoire pour remplacer la base de données (cela fonctionne mieux pour les ORM)@BeforeSuite
ou équivalent (encore une fois: plus facile avec les ORM)@Before
chaque test, effacer la base de données et initialiser avec les données nécessairesJWebUnit
pour exécuter des requêtes HTTP vers JettyCela 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.
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.
Dans notre travail ici, notre solution de test d'intégration comprend trois parties principales:
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.
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:
Test d'une application à ressort:
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).
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.
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.
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.
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/
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/