Les assertions en Java
Introduction aux assertions Définition textuelle: Proposition que l'on avance comme vraie Assert = Confirmer Instruction assert Permet de tester des suppositions sur le comportement du code Java Contient une expression booléenne supposée être vraie A l’exécution Par défaut les assertions ne sont pas activées, instruction sans effet Possibilité des les activer pour débogage et tests Evaluation de l’expression booléenne Si vraie, assert est sans effet Si fausse, une erreur est lancée Intérêt Moyen rapide et efficace de détecter les erreurs de programmation Facilite la maintenance du code en documentant le fonctionnement interne du programme Effectuer une interprétation rapide de nos certitudes par la machine (pré-conditions, post-conditions, variant, et invariant) Rappel: Un invariant est quelque chose qui est toujours vrai dans notre classe
La syntaxe A l’exécution Dans sa forme la plus élaborée, une assertion s’écrit: assert expression1 : expression2; Où expression1 est une expression booléenne, conditionnelle expression2 est une expression quelconque ou plus précisément un objet contenant les informations concernant l'échec de l'assertion Exemple:assert isMaConditionVraie() :"Ma condition doit être vérifiée"; A l’exécution expression1 est évaluée Si elle est fausse, une erreur de type AssertionError est lancée La valeur de l’expression2 (transformée en chaîne de caractères) est utilisée comme message dans l’objet AssertionError Package: Object Throwable Error AssertionError
Compilation/Activation Par défaut, le compilateur ne reconnaît pas l’instruction assert Assert a pu être utilisé comme identificateur depuis la version 1.4 de Java Pour compiler du code Java utilisant les assertions javac –source 1.4 ClasseAssertion.java Par défaut, les assertions ne sont pas testées à l’exécution Les prédicats définis par les instructions assert étant supposés être toujours vrais, il serait inefficace de les tester à chaque exécution Elles peuvent être activer à tout moment pour tester du code, diagnostiquer des erreurs, débuguer Au moment de lancer l’application, il faut spécifier à la JVM d’utiliser (ou non) les assertions à l’aide de l’argument en ligne de commande: -ea ou –enableassertions pour l’activation; -da ou –disableassertions pour la désactivation des assertions Utilisation du framework JUnit
Un aperçu des méthodes assert
Utilisation des assertions Pour documenter toutes les suppositions, il est préférable de le faire en même temps que notre développement Exemple: écriture d’une méthode manipulant une variable x pouvant prendre comme valeur soit 0, soit 1: Avant les assertions Après les assertions Assertion informelle Assertion formelle Possibilité de bugs n’apparaissant pas tout de suite et difficile à localiser Lancement d’une AssertionError, le bug apparaît immédiatement
Utilisation des assertions Pour tester une précondition d’une méthode privée Le programmeur fait la supposition que toutes les méthodes qui invoquent cette méthode respectent cette précondition Cette supposition est possible car la méthode étant privée, il a le contrôle sur tous ces appels Il peut vérifier que cette supposition est juste en activant les assertions Ne pas utiliser assert pour tester les préconditions d’une classe publique Le programmeur ne peut garantir que la méthode sera toujours appelé correctement
Utilisation des assertions Pour tester un invariant de classe Exemple: écriture d’une classe permettant d’insérer des objets dans une liste, tout en s’assurant que cette liste est toujours triée Méthode testant si la liste est correctement triée