IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tests et Performance Java Discussion :

JUnit avec une BDD [JUnit]


Sujet :

Tests et Performance Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Par défaut JUnit avec une BDD
    Bonjour,

    Comment je peux savoir qu'un assert a planté afin de faire un rollback des données que j'aurais insérer en base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Utilisateur utilisateur = createUser();
    assertFalse(utilisateurDAOImpl.existsUser(utilisateur, null));
     
    //Insertion dans la base de données
    utilisateurDAOImpl.insertUser(utilisateur, null);
     
    assertTrue(utilisateurDAOImpl.existsUser(utilisateur, null));
    //Suppression de l'utilisateur
    		utilisateurDAOImpl.deleteUser(utilisateurDAOImpl.getUser(utilisateur.getIdWiki()).getId());
    Pour illustrer : dans cet exemple, si un des asserts plantent, du coup l'utilisateur n'est pas supprimé de la base de données.

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Par défaut
    bonjour,

    il te faut travailler avec une "fausse" base de données et non la véritable base. C'est bien trop dangereux de travailler sur une véritable base.

    Tu peux voir dbunit qui te fait décrire une BDD dans un fichier XML. La base est montée en mémoire à chaque test (ou à chaque classe de test, c'est selon ton appel dans le constructeur du test) afin d'avoir des tests indépendants. Ainsi, si un assert échoue, ta base n'est pas abimée car elle est détruite au tearDown et reconstruite au setUp suivant.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Par défaut
    Ta solution serait une bonne alternative.
    Mais le but restant de tester des méthodes pointant sur les "vraies" bases de données.
    Je n'ai pas envie de dupliquer mes méthodes ou de rajouter un paramètre test pour mettre tel ou tel table dans ma requête.
    Ma réponse va refléter la flemmardise de quelques informaticiens mais mes tests JUnit étant tous réalisés, la mise en place de DbUnit me parait un peu lourde.
    Aurais tu une solution pour faire ce fameux rollback si un assert plante ?

    Merci

  4. #4
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    Les tests devant être indépendants, tu DOIS nettoyer la DB avant chaque test pour repartir d'un contexte "sain", peut importe que ton test échoue ou pas.

    Sinon, tu ne peux jamais garantir qur ton test unitaire sera valide.

    Donc, ce que tu peux faire c'est de surchager la classe TestCase pour que dans le setup() et/ou le teardown() tu nettoies ta DB.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Par défaut
    Bonjour,

    je suis d'accord : les test doivent être indépendants, et dbUnit (qui n'est pas lourd à mettre en place) permet cela facilement sans rien casser.

    par contre, attention : de quoi parle-t-on ici ?

    dbUnit permet de faire des tests unitaires de ton code java d'accès aux données (qu'on appelle souvent la couche DAO). Le propos de cet outil n'est pas de tester l'accès à la base de données, mais le code.

    ce que tu désires faire, c'est tester l'accès à la base de données : il s'agit là de tests d'intégration, et dbUnit n'est pas la solution. Là, tout dépend de la politique de ton enterprise : soi tu as accès à une base de dev ou tu peux faire ce que tu veux dessus (avec des scripts SQL pour tout nettoyer à la fin, mais berk), soi tu as accès à une base d'intégration et dans tous les cas tu dois faire des rollback en fin de transaction, car tu ne seras pas le seul à taper dessus. Pour faire ton rollback, tu peux le faire dans ton tearDown comme proposé ci-dessus, c'est à mon avis le plus propre. La méthode tearDown est appelée systématiquement, tu ne risques rien.

    cela dit, rien ne t'empeche de faire les deux : des test unitaires (indispensables) et des tests d'intégration. on peut imaginer que tes sources de tests seront dans des dossiers distincs (par exemple unit-tests et integration-tests).
    si tu utilises un outil de build en continu (continuum, luntbuild), les tests unitaires doivent êtres lancés à chaque commit et les tests d'intégration chaque jour (typiquement la nuit).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Par défaut
    Je revenais justement ici pour clore le post, en effet en fouinant sur le net ce matin, j'ai trouvé cette fameuse méthode tearDown où je supprime mes données. Je ne sais pas si c'est très propre en tout cas ça répond parfaitement à mes attentes.

    Petite précision, je n'ai pas relu mon post mais j'ai du mal m'exprimer, je ne teste pas la connection à ma base de données mais bien les méthodes contenues dans les DAO.

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JUnit] junit avec une methode void
    Par saad13121 dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 04/10/2007, 13h57
  2. [EasyPHP] installation avec une BDD
    Par LesLemmings dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 30/05/2007, 15h07
  3. Soucis avec une BDD paradox...
    Par barth69 dans le forum C++Builder
    Réponses: 38
    Dernier message: 28/05/2006, 21h38
  4. [VB] faire un update avec une bdd en xml
    Par ekmule dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 01/02/2006, 22h41
  5. Dialoguer avec une BDD MySQL en language C
    Par veridik dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/07/2005, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo