2010-01-14 5 views
2

Je tente d'écrire une grosse classe de test. J'utilise Junit, Hibernate et TopLink et la base de données H2. Avant cela, j'ai utilisé EJB3Unit (y compris Hibernate et H2).Les tests Junit échouent randomisés lors de l'utilisation de la base de données et du gestionnaire d'entités

Ma classe de test dispose de 57 méthodes de test. Si je fais tous les tests à la fois randomisés, un ou plusieurs tests échouent. Si je cours chaque test seul, je n'obtiens aucune erreur.

Quelqu'un at-il une idée de ce qui ne va pas? Et comment je peux empêcher cela?

  1. Pour chaque méthode de test, je crée une nouvelle base de données en mémoire avec un nom différent.
  2. Je crée une instance entitymanagarfactory et entitymanagar.
  3. J'ai désactivé la mise en cache de second niveau.
  4. Je crée toute la table via le script (aucune erreur ne se produit donc la base de données est vraiment fraîche).
  5. Je fais quelques actions db et test.
  6. Je vide la session et em.
  7. je laisse tomber tout objet dans ma base de données en mémoire
  8. je fermer la base de données
  9. je ferme em et fem.

Dois-je en faire plus?

Merci beaucoup ...

+0

Est-il possible que vous tiriez des objets (comme des connexions) d'un pool (disons dans la configuration d'hibernation) et que les réponses ne soient pas entièrement validées? Est-il possible que votre configuration de test ou la méthode de démontage ne soit pas correctement annotée et ne s'exécute pas avant chaque instance? Avez-vous vraiment besoin de recréer une base de données pour chaque invocation de méthode? –

+0

Est-ce que 'tout à la fois' signifie exécution parallèle ou exécution séquentielle dans une suite de tests? –

+0

Je voulais dire l'exécution séquentielle avec «tout à la fois». – marabol

Répondre

1

Il semble qu'il y ait une dépendance entre les tests. idéalement, vous devez restaurer la base de données à son état d'origine après chaque test en utilisant une méthode tearDown (dans JUnit 4, utilisez l'annotation @After).

Si vous le faites déjà, la dépendance est plus subtile. Pour trouver sa cause, je suggère que vous commenciez à faire une recherche binaire sur les tests: commentez la moitié de vos tests. Si l'échec aléatoire persiste, commentez la moitié de la moitié restante (et ainsi de suite). Si la panne disparaît alors le problème est dans l'autre moitié: décommenter et commenter l'autre moitié. Ce processus convergera assez rapidement.

Bonne chasse.

+0

J'utilise @After et @Before pour mettre en place une nouvelle base de données et la tuer. Parfois, toutes les passes de test. Tous les tests avec la méthode de test de suppression et ainsi de suite laissez-moi penser, que j'ai besoin seulement d'une masse «critique» de méthodes de test pour obtenir plus d'erreurs ou moins. – marabol

0

Les dépendances sont une possibilité pour cet échec aléatoire.

Une autre raison peut être l'ordre des éléments dans une collection. Une fois que j'écrivais un test et dépendait du premier élément. Il n'a pas été trié donc je n'étais pas sûr que l'objet que je demandais était toujours le même.

+0

Merci beaucoup ...La commande n'est pas le problème dans ce cas (mais je l'ai fait aussi ,-)). Il coule, il y a des entrées "fantômes". Je pense que le PM enregistre des informations dans des threads locaux ou des variables statiques. Si j'ai plus de temps, je regarderai plus loin. – marabol

Questions connexes