Ir al contenido principal

Ejecución de pruebas en Zig

Para facilitar la comprensión de los ejemplos que se muestran en este tutorial, muchos de ellos se presentarán como pruebas ejecutables. Los pruebas son un modo sencillo de ejecutar código y verificar los resultados. Veamos a continuación cómo usarlas.

¿Qué son las pruebas?

Las pruebas o tests unitarios son una funcionalidad de muchos lenguajes que permiten probar fragmentos de código. Para realizar las pruebas, se proveen una serie de datos y se verifica que el resultado es el esperado. Piensa en una función que devuelve el día a partir de una fecha, en pseudocódigo:

FUNCTION devuelve_dia (fecha)
    RETURN fecha.dia
END FUNCTION

Un test para esta función consistirá en pasarle varias fechas en diferentes formatos, por ejemplo 12/01/2004, 1/12/2004, 12.1.2024 y verificar que siempre devuelve 12, que es el día.

Las pruebas en Zig están definidas en la librería estándar std y para definir pruebas se usa la instrucción test. Veamos un ejemplo de pruebas en Zig:

const std = @import("std");

test "verificar que 2 + 2 es 4" {
    const a = 2;
    const b = 2;
    const resultado = a + b;

    try std.testing.expect(resultado == 4);
}

En la primera línea importamos la librería estándar que contiene todo lo necesario para ejecutar pruebas. A continuación definimos un test al que hemos llamado 'verificar que 2 + 2 es 4'. En la prueba hemos definido tres variables, los operandos a y b además de la variable de resultado. La línea try std.testing.expect(resultado == 4); es el test en si mismo. La primera parte de la instrucción std es la constante que contiene la referencia a la librería estándar y testing es el espacio de nombres que contiene las funciones de pruebas. La función expect verifica que la expresión pasada como argumento sea evaluada a true para que la prueba sea correcta.

Abre Visual Studio Code, crea un nuevo archivo con extensión .zig y pega el código anterior. A la izquierda de la instrucción test aparecerá un símbolo 'play' de color verde, púlsalo para ejecutar la prueba unitaria:

 introduccion_test_play_code_detail.png

La prueba se ejecutará y mostrará el resultado en la pestaña 'Tests':

introduccion_test_results_detail.png

Como puedes observar el resultado del test es OK porque se verifica correctamente que la suma de las variables a y b da como resultado 4.

Declaración de pruebas

Las pruebas se declaran por medio de la palabra clave test seguida de un nombre, que es opcional. El nombre puede ser especificado usando un identificador o variable. A continuación, se declara un bloque de código que debe contener una serie de instrucciones en Zig como aquellas permitidas en una función.

Si una prueba no tiene definido ningún nombre, esta se ejecutará siempre que se ejecuten las pruebas y no puede ser desactivada de forma manual.  Esto ocurre porque la desactivación de pruebas requiere que esta tenga un nombre.

Resultado incorrecto

En el apartado anterior vimos un ejemplo de prueba que devuelve un resultado correcto, porque efectivamente la evaluación de la condición ha sido true. Veamos el siguiente código a continuación:

test "test que siempre falla" {
    try expect(false);
}

Ejecuta la prueba pulsando en el botón 'play'. La ejecución devolverá un error similar a este:

1/1 introduccion_test.test.test que siempre falla...FAIL (TestUnexpectedResult)
C:\....\lib\std\testing.zig:540:14: 0xf3102f in expect (test.exe.obj)
    if (!ok) return error.TestUnexpectedResult;
             ^
D:\dbtutoriales\Tutoriales\Zig\introduccion_test.zig:13:5: 0xf31147 in test.test que siempre falla (test.exe.obj)
    try expect(false);
    ^
0 passed; 0 skipped; 1 failed.