Bienvenidos sean a este post, hoy veremos dos derivaciones de la macro assert.
Cada vez que hacemos un test usualmente hacemos comparaciones para verificar si es correcto y en otras ocasiones debemos usar una equivalencia, por ejemplo en el post anterior hablamos sobre assert y podriamos utilizar este metodo si modificamos en la funcion de comparacion los signos mayores por el de igualdad (==), aunque esto seria un desperdicio dado que la libreria estandar nos provee una macro para hacer esto llamada assert_eq asi como tambien una llamada assert_ne para verificar la no igualdad, en cualquiera de los dos casos nos indicara un false sino se cumple la equivalencia que verifica cada macro, a diferencia de assert donde podemos hacer la misma conducta pero nunca veriamos cuales son los valores que producen la falla, su sintaxis es muy simple:
assert_eq!(valor1, valor2)
assert_ne!(valor1, valor2)
Como pueden ver siempre pasaremos dos valores para que se comparen entre si y en caso de cumplirse la igualdad o no respectivamente devolvera un true, en caso de devolver un false llamara a panic para comentar la falla, tomemos el ejemplo que vimos en este post, si no lo tienen generen un nuevo proyecto de tipo libreria llamado prueba, y modifiquemos el codigo de lib.rs de la siguiente manera:
lib.rs
pub fn agregar_dos(a: i32) -> i32
{
a + 2
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn agrego_dos()
{
assert_eq!(4, agregar_dos(2));
}
}
Aqui tenemos una funcion llamada agregar_dos donde recibira un valor lo incrementara en dos y lo devolvera, luego en el main usamos a super para establecer que usaremos el modulo base, en el atributo de test usaremos una nueva funcion donde por medio de assert_eq chequea un valor y el resultado de la funcion anterior, compileamos y veamos que sucede:
tinchicus@dbn001vrt:~/lenguajes/rust/prueba$ cargo test
Finished test [unoptimized + debuginfo] target(s) in 0.02s
Running unittests (target/debug/deps/prueba-e23faeddfadd8fad)
running 1 test
test tests::agrego_dos ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests prueba
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
tinchicus@dbn001vrt:~/lenguajes/rust/prueba$
Como pueden ver funciono correctamente porque sabemos que 2 + 2 es igual a 4, hasta que se demuestre lo contrario, pero que pasa si a nuestro llamado dentro de assert_eq lo modificamos de la siguiente manera:
assert_eq!(4, agregar_dos(3));
Volvamos a correr el test y veamos su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/prueba$ cargo test
Finished test [unoptimized + debuginfo] target(s) in 0.02s
Running unittests (target/debug/deps/prueba-e23faeddfadd8fad)
running 1 test
test tests::agrego_dos ... FAILED
failures:
---- tests::agrego_dos stdout ----
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `4`,
right: `5`', src/lib.rs:13:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
tests::agrego_dos
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
error: test failed, to rerun pass '--lib'
tinchicus@dbn001vrt:~/lenguajes/rust/prueba$
Si observan no solo nos dice que fallo sino que ademas nos indica el motivo de la falla en el assert, algo que no nos indicaba en el ejemplo que vimos en el post anterior, vamos a tomar la linea anterior:
assert_eq!(4, agregar_dos(3));
Y lo modificaremos de la siguiente manera:
assert_ne!(4, agregar_dos(3));
Ahora utilizaremos al otro macro donde verifica que no sean iguales, corramos nuevamente el test y veamos su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/prueba$ cargo test
Compiling prueba v0.1.0 (/home/tinchicus/lenguajes/rust/prueba)
Finished test [unoptimized + debuginfo] target(s) in 1.74s
Running unittests (target/debug/deps/prueba-e23faeddfadd8fad)
running 1 test
test tests::agrego_dos ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests prueba
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
tinchicus@dbn001vrt:~/lenguajes/rust/prueba$
Como podemos ver volvio a funcionar correctamente porque ahora si se cumple la condicion, por ultimo tomemos la funcion del test:
fn agrego_dos()
{
assert_eq!(4, agregar_dos(2));
}
Y modifiquemosla de la siguiente manera:
fn agrego_dos()
{
assert_eq!(4, agregar_dos(2));
assert_ne!(4, agregar_dos(2));
}
Ahora haremos un doble chequeo para las dos macros, corramos por ultima vez el test y veamos como es su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/prueba$ cargo test
Compiling prueba v0.1.0 (/home/tinchicus/lenguajes/rust/prueba)
Finished test [unoptimized + debuginfo] target(s) in 1.27s
Running unittests (target/debug/deps/prueba-e23faeddfadd8fad)
running 1 test
test tests::agrego_dos ... FAILED
failures:
---- tests::agrego_dos stdout ----
thread 'main' panicked at 'assertion failed: `(left != right)`
left: `4`,
right: `4`', src/lib.rs:14:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
tests::agrego_dos
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
error: test failed, to rerun pass '--lib'
tinchicus@dbn001vrt:~/lenguajes/rust/prueba$
Como pueden ver, uno de los assert al ser verdadero paso sin problema pero el otro al ser falso devolvio el panic, por lo tanto tengan en cuenta que no solamente pueden correr varios sino que al primero que falle nos detendra el test y lo considerara como fallido, tambien observen como nos notifica la falla y en este caso debe evaluar que el primer y segundo valor sean distintos.
En resumen, hoy hemos visto las macros assert_eq y assert_ne, como trabajan, como se diferencian con assert a secas, como nos pueden ser un poco mas especificas para las fallas del test, despues vimos un ejemplo con distintas formas de aciertos y fallas, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
