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

Java Discussion :

[JUnit] Gerer les exceptions et reinitialiser la BDD apres chaque test


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut [JUnit] Gerer les exceptions et reinitialiser la BDD apres chaque test
    Salut,

    Quelques questions sur JUnit et les tests en general :

    1- Dans certains tests, j'espere qu'une methode lancera une exception. Je gere cela en capturant Exception et en utilisant instanceof pour voir si j'ai bien recupere l'exception attendue. Cependant, si la methode ne leve pas d'exception, pas de test, et donc sauf a lire les logs en detail, je n'arriverai pas a dire si le test a reussi parce que l'exception a ete lancee ou parce qu'aucune n' a ete generee. Y a t il un moyen avec JUnit d'echouer le test si l'exception n'est pas generee ? Un test en exemple : mettre a jour un record dans une base contenant des chambres d'hotel. Le 3eme test correspond a la question ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    /**
             * Test method for {@link suncertify.db.RoomFileAccess#update(int, java.lang.String[], long)}.
             * @throws RecordNotFoundException 
             * @throws DatabaseFailureException 
             * @throws SecurityException 
             */
    	@Test
    	public final void testUpdate() throws SecurityException, DatabaseFailureException, RecordNotFoundException {
    		String[] oldRecord = {"Palace", "Smallville", "2", "Y", "$150.00", "2005/07/27", ""};
    		String[] newRecord = {"Sofitel", "Paris", "5", "N", "$1110.00", "2010/03/14", ""};
    		String[] recordWithCookie = {"Belgravia", "Tokyo", "2", "3", "$110.00", "2020/12/20", "2345"};
    		String[] invalidRecord = {"Novotel", "London", "1", "N", "$1111110.00", "2010/03/14", ""};
     
    		/*
    		 * Updating first record
    		 */
    		rfa.update(0, newRecord, 15);
    		assertTrue(Arrays.equals(rfa.read(0), newRecord));
     
    		/*
    		 * Updating 24th record
    		 */
    		rfa.update(23, oldRecord, 15);
    		assertTrue(Arrays.equals(rfa.read(23), oldRecord));
     
    		/*
    		 * Updating a deleted record
    		 * Should raise a RecordNotFoundException
    		 */
    		rfa.delete(27, 15);
    		try {
    			rfa.update(27, newRecord, 15);
    		} catch (Exception e) {
    			assertTrue(e instanceof RecordNotFoundException);
    		}
     
    		/*
    		 * Updating a record with a different cookie
    		 * Should raise a SecurityException
    		 */
    		try {
    			rfa.update(20, recordWithCookie, 15);
    			rfa.update(20, newRecord, 15);
    		} catch (Exception e) {
    			assertTrue(e instanceof SecurityException);
    		}
     
    		/*
    		 * Updating a record with the same cookie
    		 */
    		rfa.update(20, oldRecord, 2345);
     
    		/*
    		 * Updating a record with an invalid entry - too big to go in
    		 * Should raise a DatabaseFailureException
    		 */
    		try {
    			rfa.update(13, invalidRecord, 15);
    		} catch (Exception e) {
    			assertTrue(e instanceof DatabaseFailureException);
    		}
     
    	}
    2- Chacune des methodes testee laisse la BDD (un fichier texte) dans un etat instable. Dans l'exemple ci-dessus, je delete des records, en ajoute, etc... mais derriere pour tester une autre methode, j'ai besoin de reinitialiser la BDD a son etat d'origine. Pour l'instant, j'ai un script qui permet de detruire l'ancienne version et de copier un backup a la place, ce qui me force a lancer les tests manuellement, un a un, en reintialisant la BDD apres chaque test.
    Y a t il un moyen simple pour resoudre ce probleme ? J'imagine que je ne suis pas le 1er a tomber dessus, mais mes recherches n'ont rien donne pour automatiser tout cela. setUp() ne semble pas etre la voie.

    3- Dans le registre methodologies de test recommandees, chacune de mes methodes de test depend (fortement ?) des autres. Dans le test ci-dessus par exemple, j'appelle delete(), et chacun des appels d'update() implicitement fait appel a read(). J'ai donc l'impression de creer beaucoup d'interdependances. J'ai verifie que read() et delete() sont solides avant de construire les autres methodes ainsi que leurs tests, mais je me demande si cela (ie, creer des interdependances) est une bonne pratique et si vous ecriviez ainsi vos tests.

    Merci.

    Nuriel

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    1. oui, en général (c'est controversé mais bon), le test ressemble à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    boolean gotit = false;
    try {
     monObject.methodeAtester();
    } catch (ExceptionAChoper e){
       gotit=true:
    }
    assertTrue(gotit,"on aurait du avoir ExceptionAChoper");
    2. C'est le rôle des méthode setup et tearDown de préparer au test / nettoyer après le test. Ces méthodes sont appelé entre chaque méthode test

    3. Tu dois éviter de te répéter inutilement dans tes tests. Si tu as déjà une méthode qui teste la cohérence de update(), alors tu peux présupposer dans ton test (éventuellement document) que les update fonctionne et tester uniquement delete. Si tu documente bien, le jour ou t'aura des exceptions de derrière les fagots dans ton testDelete, tu ira voir la doc du test qui dira 'nécessite le fonctionnement correct de update' et tu verra que testUpdate a fail -> pas besoin de cherche pourquoi delete a foiré

  3. #3
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Pour tester une exception, j'utilise plutôt cette syntaxe, plus concise car ne nécessitant pas de booléen (mais comme dit tchize_, c'est controversé et chacun a ses manies dans le codage des tests ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
        methodeTestDevantLeverUneException();
        fail("Il aurait dû y avoir une exception");
    } catch(Exception e) {
        // Test passé avec succès !
    }
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut
    Merci.

    Concernant l'exception, je vais prendre l'option boolean, qui dans mon cas me donne un plus grand control.

    Resolu mon probleme avec la methode setUp() mais je n'ai aucune idee de comment.

    Quant a la documentation, plus j'avance dans ce projet, et plus je me rends compte qu'elle est importante.

    Nuriel

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

Discussions similaires

  1. Gerer les exceptions
    Par xduris dans le forum Langage
    Réponses: 4
    Dernier message: 11/07/2008, 16h40
  2. Gerer les exceptions
    Par pham1980 dans le forum Struts 2
    Réponses: 7
    Dernier message: 14/01/2008, 21h33
  3. Gerer les exceptions des Threads
    Par petozak dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/11/2006, 13h27
  4. Gérer les exceptions sous devc++
    Par nico49 dans le forum Dev-C++
    Réponses: 7
    Dernier message: 06/01/2006, 13h57
  5. [Exception]Comment gérer les exceptions ?
    Par Gildas Huart dans le forum Général Java
    Réponses: 7
    Dernier message: 29/03/2005, 18h01

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