Afirmaciones de Java: Pruebas de supuestos

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá sobre las afirmaciones en Java. Aprenderá cómo crear afirmaciones y cuándo utilizarlas. Las afirmaciones se utilizan para probar supuestos sobre nuestro código y se utilizan principalmente durante la fase de prueba del software.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/switch("Switch") java/BasicSyntaxGroup -.-> java/output("Output") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/user_input("User Input") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/FileandIOManagementGroup -.-> java/files("Files") java/SystemandDataProcessingGroup -.-> java/math_methods("Math Methods") java/SystemandDataProcessingGroup -.-> java/system_methods("System Methods") subgraph Lab Skills java/operators -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} java/variables -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} java/switch -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} java/output -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} java/user_input -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} java/exceptions -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} java/files -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} java/math_methods -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} java/system_methods -.-> lab-117470{{"Afirmaciones de Java: Pruebas de supuestos"}} end

Creando una afirmación simple

Vamos a crear una afirmación simple que pruebe si un número es par. Vamos a suponer que el número es par y escribir una afirmación usando un número par. Luego modificaremos el número y ejecutaremos el código. Deberíamos obtener un AssertionError.

public class AssertionsLab {
    public static void main(String[] args) {
        int number = 4;
        assert (number % 2) == 0;
        System.out.println("Number is even");

        // change the value of number variable to odd
        number = 3;
        assert (number % 2) == 0;
        System.out.println("Number is even");
    }
}

Deshabilitando afirmaciones

Por defecto, las afirmaciones están deshabilitadas en Java. Podemos habilitar las afirmaciones utilizando opciones de línea de comandos.

Vamos a utilizar la opción -ea para habilitar las afirmaciones y ejecutar el código.

java -ea AssertionsLab

El código debería imprimir "Number is even" seguido de un AssertionError.

Ahora deshabilitemos las afirmaciones utilizando la opción -da y ejecutemos el código nuevamente.

java -da AssertionsLab

El código debería imprimir "Number is even" dos veces sin lanzar ninguna excepción.

Utilizando afirmaciones para probar entradas

Las afirmaciones también se pueden utilizar para probar las entradas de un método. Vamos a crear un método divide que tome dos parámetros y devuelva el cociente después de dividir el primer parámetro por el segundo parámetro. Vamos a suponer que el segundo parámetro es distinto de cero y crear una afirmación para comprobarlo.

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

        // cambia el valor de b a cero
        b = 0;
        result = divide(a, b);
        System.out.println("Resultado: " + result);
    }

    private static int divide(int a, int b) {
        assert b!= 0 : "No se puede dividir por cero";
        return a / b;
    }
}

Utilizando afirmaciones para depuración y pruebas

Podemos utilizar afirmaciones para depurar y probar. Asumamos que tenemos un programa que lee un archivo y devuelve el primer número no nulo de él. Para probar este programa, vamos a crear un archivo de entrada con tres números.

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

Vamos a escribir nuestro programa que lee el archivo y devuelve el primer número no nulo de él. Luego crearemos una afirmación para probar si el programa devuelve la salida correcta.

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 : "Número incorrecto leído del archivo";
        System.out.println("Primer número no nulo: " + number);
    }
}

Cuando no utilizar afirmaciones

Las afirmaciones no son adecuadas para validar los argumentos de métodos públicos. Estas afirmaciones pueden estar deshabilitadas durante la ejecución lo que puede conducir a un comportamiento inesperado.

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

    public static void printPositiveNumber(int number) {
        assert (number > 0) : "No es un número positivo válido";
        System.out.println("Número positivo: " + number);
    }
}

Hacer que las afirmaciones sean informativas

Podemos agregar mensajes informativos a las afirmaciones para que sean más informativas y brinden una mejor retroalimentación en caso de error. Ahora modificaremos la afirmación en el código anterior para incluir un mensaje informativo.

public class AssertionsLab {
    public static void main(String[] args) {
        int number = -1;
        assert (number > 0) : "Se encontró un número negativo";
        System.out.println("El número es positivo: " + number);
    }
}

El mensaje "Se encontró un número negativo" se mostrará cuando se ejecute el código.

Evitando que las afirmaciones rompan el código

El propósito de las afirmaciones generalmente es encontrar errores al probar software. Sin embargo, si las afirmaciones mismas rompen el código, entonces se vuelve problemático. Por ejemplo, un error transitorio en la red o un problema de tiempo en un sistema puede causar que una afirmación falle. Además, si usamos afirmaciones para validar entradas en métodos públicos, corremos el riesgo de dejar nuestro sistema sin protección contra entradas inválidas y maliciosas.

Una forma de evitar el impacto negativo de las afirmaciones es usarlas con prudencia. Utilice afirmaciones solo para cosas que nunca deberían suceder en un sistema bien diseñado.

public class AssertionsLab {
    public static void main(String[] args) {
        double result = squareRoot(4);
        System.out.println("Raíz cuadrada: " + result);

        double negativeNumber = -4;
        result = squareRoot(negativeNumber);
        System.out.println("Raíz cuadrada: " + result);
    }

    public static double squareRoot(double number) {
        assert number >= 0 : "El número debe ser no negativo";
        return Math.sqrt(number);
    }
}

Evitando efectos secundarios

Es importante evitar efectos secundarios al usar afirmaciones. Debemos evitar cambiar variables dentro de las afirmaciones. En lugar de eso, las expresiones deben usarse para detectar situaciones problemáticas y proporcionar más información de diagnóstico.

public class AssertionsLab {
    public static void main(String[] args) {
        int firstNumber = 1;
        int secondNumber = 2;
        assert (firstNumber = secondNumber) == 0 : "Los valores no son iguales";
        System.out.println("Los valores son iguales");
    }
}

Usando afirmaciones para comprobar instrucciones switch

Podemos usar afirmaciones para comprobar si se han cubierto todos los casos posibles de una instrucción switch. Vamos a crear una instrucción switch que devuelva el nombre de un día en función de su número. Asumiremos que el número está en el rango de 0 a 6 y crearemos una afirmación para comprobarlo.

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

        // Establece dayNumber a un número no válido
        dayNumber = 10;
        day = getDayName(dayNumber);
        System.out.println("Día: " + day);
    }

    public static String getDayName(int dayNumber) {
        String day;
        switch (dayNumber) {
            case 0:
                day = "Domingo";
                break;
            case 1:
                day = "Lunes";
                break;
            case 2:
                day = "Martes";
                break;
            case 3:
                day = "Miércoles";
                break;
            case 4:
                day = "Jueves";
                break;
            case 5:
                day = "Viernes";
                break;
            case 6:
                day = "Sábado";
                break;
            default:
                assert false : "Número de día no válido";
        }
        return day;
    }
}

Resumen

¡Felicitaciones! Has completado el laboratorio de afirmaciones de Java. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.