Assertions Java : Tester les hypothèses

JavaBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous allez apprendre les assertions en Java. Vous allez découvrir comment créer des assertions et quand les utiliser. Les assertions sont utilisées pour tester les hypothèses relatives à notre code et sont principalement utilisées pendant la phase de test du logiciel.

Création d'une assertion simple

Créons une assertion simple qui teste si un nombre est pair. Nous supposerons que le nombre est pair et écrivons une assertion en utilisant un nombre pair. Nous allons ensuite modifier le nombre et exécuter le code. Nous devrions obtenir une AssertionError.

public class AssertionsLab {
    public static void main(String[] args) {
        int number = 4;
        assert (number % 2) == 0;
        System.out.println("Le nombre est pair");

        // changez la valeur de la variable number en impair
        number = 3;
        assert (number % 2) == 0;
        System.out.println("Le nombre est pair");
    }
}

Désactivation des assertions

Par défaut, les assertions sont désactivées en Java. Nous pouvons les activer en utilisant des options de ligne de commande.

Utilisons l'option -ea pour activer les assertions et exécuter le code.

java -ea AssertionsLab

Le code devrait afficher "Le nombre est pair" suivi d'une AssertionError.

Désactivons maintenant les assertions en utilisant l'option -da et exécutons le code à nouveau.

java -da AssertionsLab

Le code devrait afficher "Le nombre est pair" deux fois sans lever d'exception.

Utilisation d'assertions pour tester les entrées

Les assertions peuvent également être utilisées pour tester les entrées d'une méthode. Créons une méthode divide qui prend deux paramètres et renvoie le quotient après avoir divisé le premier paramètre par le second paramètre. Nous supposerons que le second paramètre est non nul et créons une assertion pour le vérifier.

public class AssertionsLab {
    public static void main(String[] args) {
        int a = 10;
        int b = 5;
        int result = divide(a, b);
        System.out.println("Résultat : " + result);

        // changez la valeur de b en zéro
        b = 0;
        result = divide(a, b);
        System.out.println("Résultat : " + result);
    }

    private static int divide(int a, int b) {
        assert b!= 0 : "Impossible de diviser par zéro";
        return a / b;
    }
}

Utilisation d'assertions pour le débogage et les tests

Nous pouvons utiliser les assertions pour le débogage et les tests. Supposons que nous ayons un programme qui lit un fichier et renvoie le premier nombre non nul qu'il contient. Pour tester ce programme, créons un fichier d'entrée avec trois nombres.

echo "0\n3\n0" > input.txt

Écrivons notre programme qui lit le fichier et renvoie le premier nombre non nul qu'il contient. Nous allons ensuite créer une assertion pour tester si le programme renvoie la sortie correcte.

import java.io.File;
import java.io.FileNotFoundException;
+ import java.util.Scanner;

public class AssertionsLab {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File("input.txt"));
        int number = 0;
        while (scanner.hasNext()) {
            number = scanner.nextInt();
            if (number!= 0) {
                break;
            }
        }
        assert number == 3 : "Nombre incorrect lu à partir du fichier";
        System.out.println("Premier nombre non nul : " + number);
    }
}

Quand ne pas utiliser d'assertions

Les assertions ne sont pas adaptées pour valider les arguments des méthodes publiques. Ces assertions peuvent être désactivées pendant l'exécution, ce qui peut entraîner un comportement inattendu.

public class AssertionsLab {
    public static void main(String[] args) {
        int negativeNumber = -1;
        printPositiveNumber(negativeNumber);
    }

    public static void printPositiveNumber(int number) {
        assert (number > 0) : "Ce n'est pas un nombre positif valide";
        System.out.println("Nombre positif : " + number);
    }
}

Rendre les assertions informatives

Nous pouvons ajouter des messages d'information aux assertions pour les rendre plus informatives et fournir des commentaires plus utiles en cas d'échec. Nous allons maintenant modifier l'assertion dans le code précédent pour inclure un message d'information.

public class AssertionsLab {
    public static void main(String[] args) {
        int number = -1;
        assert (number > 0) : "Nombre négatif trouvé";
        System.out.println("Le nombre est positif : " + number);
    }
}

Le message "Nombre négatif trouvé" sera affiché lors de l'exécution du code.

Empêcher les assertions de casser le code

Le but des assertions est généralement de trouver des bugs lors des tests du logiciel. Cependant, si les assertions elles-mêmes cassent le code, cela devient problématique. Par exemple, une erreur réseau transitoire ou un problème de synchronisation dans un système peut entraîner l'échec d'une assertion. De plus, si nous utilisons des assertions pour valider les entrées des méthodes publiques, nous courons le risque de laisser notre système sans protection contre des entrées invalides et malveillantes.

Une manière de contourner l'impact négatif des assertions est de les utiliser judicieusement. Utilisez les assertions uniquement pour des choses qui ne devraient jamais se produire dans un système bien conçu.

public class AssertionsLab {
    public static void main(String[] args) {
        double result = squareRoot(4);
        System.out.println("Racine carrée : " + result);

        double negativeNumber = -4;
        result = squareRoot(negativeNumber);
        System.out.println("Racine carrée : " + result);
    }

    public static double squareRoot(double number) {
        assert number >= 0 : "Le nombre devrait être non négatif";
        return Math.sqrt(number);
    }
}

Éviter les effets de bord

Il est important d'éviter les effets de bord lors de l'utilisation d'assertions. Nous devrions éviter de modifier des variables à l'intérieur des assertions. Au lieu de cela, les expressions devraient être utilisées pour détecter des situations problématiques et fournir plus d'informations de diagnostic.

public class AssertionsLab {
    public static void main(String[] args) {
        int firstNumber = 1;
        int secondNumber = 2;
        assert (firstNumber = secondNumber) == 0 : "Les valeurs ne sont pas égales";
        System.out.println("Les valeurs sont égales");
    }
}

Utiliser des assertions pour vérifier les instructions switch

Nous pouvons utiliser les assertions pour vérifier si tous les cas possibles d'une instruction switch ont été couverts. Créons une instruction switch qui renvoie le nom d'un jour en fonction de son numéro. Nous supposerons que le numéro est compris dans la plage de 0 à 6 et créons une assertion pour le vérifier.

public class AssertionsLab {
    public static void main(String[] args) {
        int dayNumber = 2;
        String day = getDayName(dayNumber);
        System.out.println("Jour : " + day);

        // définir dayNumber sur un numéro invalide
        dayNumber = 10;
        day = getDayName(dayNumber);
        System.out.println("Jour : " + day);
    }

    public static String getDayName(int dayNumber) {
        String day;
        switch (dayNumber) {
            case 0:
                day = "Dimanche";
                break;
            case 1:
                day = "Lundi";
                break;
            case 2:
                day = "Mardi";
                break;
            case 3:
                day = "Mercredi";
                break;
            case 4:
                day = "Jeudi";
                break;
            case 5:
                day = "Vendredi";
                break;
            case 6:
                day = "Samedi";
                break;
            default:
                assert false : "Numéro de jour invalide";
        }
        return day;
    }
}

Résumé

Félicitations ! Vous avez terminé le laboratoire sur les assertions Java. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.