2010-05-25 9 views
9

Est-il possible d'exécuter rapidement un test d'intégration simple/intégral dans une classe rapidement dans Grails? Le test-app vient avec un lourd bagage d'effacement de tous les fichiers compilés et génère des rapports cobertura donc même si nous exécutons un test d'intégration unique, toute la base de code est compilée, instrumentée et le rapport cobertura est généré. Pour notre application, cela prend plus de 2 minutes.Exécution d'un test d'intégration unique rapidement dans Grails

S'il était possible d'exécuter rapidement un test d'intégration et d'obtenir un feedbck rapide, cela serait extrêmement utile.

De même, est-il important de nettoyer tous les fichiers compilés une fois le test terminé? Ce nettoyage est très bien si nous exécutons l'ensemble du test d'intégration, mais si nous devons effectuer un ou deux tests dans une classe, le nettoyage et la recompilation semblent être un gros goulot d'étranglement pour une rétroaction plus rapide aux développeurs.

Merci

Répondre

5

Il est l'intention du test d'intégration pour faire la compilation entière, la création de base de données, le démarrage du serveur, etc., parce que les tests doivent fonctionner dans un environnement intégré, comme son nom l'indique. Peut-être que vous pouvez extraire quelques tests pour les tests unitaires.

Ceux-ci vous pouvez courir dans Eclipse.

Vous pouvez désactiver Cobertura en plaçant le code suivant dans votre Grails-app/conf/BuildConfig.groovy:

coverage { 
    enabledByDefault = false 
} 
+0

L'infestation de cobertura présentait le problème. Nous utilisions le plugin cobertura et le plugin nettoyait toutes les sources compilées après la génération du rapport, ce qui nous empêchait d'exploiter tous les avantages associés à la compilation incrémentale. De plus, l'exécution d'un ou deux tests ne nécessite pas de rapport Cobertura complet et le test d'intégration s'est déroulé rapidement une fois que nous l'avons désactivé. Merci pour le pointeur. – Prakash

15

Si vous avez une classe de test d'intégration

class SimpleControllerTests extends GrailsUnitTestCase { 
    public void testLogin() {} 
    public void testLogin2() {} 
    public void testLogin3() {} 
} 

Vous pouvez exécuter un seul test dans cette classe en utilisant:

grails test-app integration: SimpleController.testLogin 

Cependant, vous devrez toujours me pénalité requise pour les tests d'intégration (chargement de configuration, connexion à DB, instanciation de beans Spring, etc.)

Si vous voulez que vos tests s'exécutent rapidement, essayez d'écrire des tests unitaires plutôt que des tests d'intégration.

+0

L'exécution d'un exemple de test fonctionne, mais nécessite le chemin d'accès complet à la classe –

0

Comme vous l'avez indiqué, la majorité du temps consiste à configurer l'environnement d'application, à injecter des beans et à effectuer les annotations de classes dynamiques. Vous pouvez accélérer votre cycle de test d'intégration en ne le chargeant qu'une seule fois, en exécutant vos tests dans le graphe REPL. Cependant, le compromis est qu'il existe des problèmes de rechargement dynamique dans le REPL. Si vous voyez une bizarrerie aléatoire, quittez le REPL et rechargez.

$> ./grailsw --plain-output 
|Loading Grails 2.5.3 
|Configuring classpath 
|Enter a script name to run. Use TAB for completion: 
grails> test-app -integration 
... (loads some things) 
... 
grails> test-app -integration 
... (faster loading) 

Et pour répondre aux autres commentateurs - tests d'intégration sont utiles aussi bien, il y a un code qui ne peut pas être testé avec un test unitaire (par exemple, les tests HQL ou des requêtes SQL).