Anuncios

Bienvenidos sean a este post, hoy vamos a ver como hacer un test sobre nuestro crate.

Anuncios

En este post creamos un crate y en el post anterior lo implementamos viendo como funcionaba correctamente, hoy nos centraremos en la mecanica de como hacer un test sobre un crate, para ello haremos un par de modificaciones, iremos al codigo de nuestro crate (sino lo tienen les recomiendo ver este post y generarlo) y dentro de nuestro directorio src crearemos un nuevo archivo que llamaremos temperatura.rs y le agregaremos el siguiente codigo:

temperatura.rs

pub fn kelvin_a_celsius(k: f32) -> (bool, f32)
{
	if k < 0f32
	{
		return (false, k);
	} else {
		return (true, k -273.15);
	}
}
Anuncios

Aqui tendremos una funcion que nos convertira los grados Kelvin en Celsius, tiene una curiosidad que nos devuelve dos tipos de valores:

  • bool, dado que tendremos que respetar una condicion
  • float, es el valor que convertiremos
Anuncios
Anuncios

Vamos a comentar el tema del bool, para ello tendremos un condicional donde verificamos si el valor en el argumento no sea menor a cero, dado que en Kelvin no tenemos ningun valor por debajo de el, si este valor es menor que cero devolveremos un false y el valor ingresado, en cambio cualquier valor que sea de cero para arriba devolveremos un true y el resultador de la operacion entre el valor ingresado menos el valor del cero absoluto, con esto podremos evitar tener un valor falso, una operacion simple y nos sirve como ejemplo para evitar que se cumplan condiciones inexistentes, nuestro siguiente paso sera agregar la siguiente linea dentro del archihvo lib.rs dentro del directorio src:

pub mod temperatura;
Anuncios

Simplemente para que sepa de la existencia de nuestro nuevo submodulo, el siguiente paso sera crear un nuevo directorio por fuera de src y en el raiz del proyecto que llamaremos tests, una vez creado haremos dos nuevos archivos:

  • lib.rs
  • temperatura_test.rs
Anuncios

Uno se encargara del test en si y el otro sera para lo mismo que en el directorio src, por esta razon comenzaremos agregando el codigo para este archivo:

lib.rs

mod temperatura_test;
Anuncios

Como este sera para un testeo interno no es necesario usar el pub pero igual que siempre es solo para declarar el prototipo de nuestro submodulo, lo siguiente sera agregar el codigo para temperatura_test.rs:

temperatura_test.rs

extern crate convlib;

mod temperatura_test
{
	use super::convlib::temperatura;

	#[test]
	fn test_kelvin_a_celsius_pasa()
	{
		let k = temperatura::kelvin_a_celsius(14.5);
		assert_eq!(k.0, true);
	}

	#[test]
	#[should_panic(expected = "assertion failed")]
	fn test_kelvin_a_celsius_falla()
	{
		let k = temperatura::kelvin_a_celsius(-4f32);
		assert_eq!(k.0, true);
	}
}
Anuncios

Primera curiosidad, debemos informar que usara el crate que testearemos, luego a diferencia de los otros modulos si le informamos que sera este submodulo, en este le diremos que use al nuevo submodulo que hicimos pero observen un detalle, agregamos a super, este es para decirle que debemos usar el modulo base actual y el resto del path para llegar a este, vamos a analizar el primer bloque de instrucciones:

	#[test]
	fn test_kelvin_a_celsius_pasa()
	{
		let k = temperatura::kelvin_a_celsius(14.5);
		assert_eq!(k.0, true);
	}
Anuncios

En este caso agregamos el atributo de test, para indicarle que se usara cuando hagamos este, aqui definiremos una funcion para el caso de cuando pasa el chequeo, para ello crearemos una variable donde almacenaremos el resultado del llamado a la funcion que creamos al comienzo, despues usamos a assert_eq para verificar si el resultado devuelto en el primer campo es igual a true, si lo observamos veremos que deberia funcionar perfectamente, veamos el sigueinte bloque:

	#[test]
	#[should_panic(expected = "assertion failed")]
	fn test_kelvin_a_celsius_falla()
	{
		let k = temperatura::kelvin_a_celsius(-4f32);
		assert_eq!(k.0, true);
	}
Anuncios
Anuncios

Es muy similar al anterior pero agregamos otro atributo, en este caso usamos a should_panic este nos permitira pasar el test si por alguna razon el codigo de la funcion falla o entra en panico 😱, para este caso usamos expected para indicar cual deberia ser el tipo de falla que deberia esperar para poder pasar de este y no detener el codigo, aqui usamos otra funcion muy similar a la anterior pero que sabremos que fallara porque pasamos un valor menor a cero para la funcion kelvin_a_celsius, luego tenemos el mismo assert_eq que en la anterior funcion, con esto tenemos nuestro modulo para testear, solo nos faltan un cambio mas, para ello debemos ir al archivo Cargo.toml y agregaremos el siguiente bloque:

[lib]
name = "convlib"
path = "src/lib.rs"
Anuncios

En este caso para indicar cual sera la libreria que usaremos para el test e internamente, en este caso primero le pasamos el nombre que lo identifica y luego pasamos cual es el archivo que debemos usar, veamos como quedo nuestro archivo:

Cargo.toml

[package]
name = "convlib"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]


[lib]
name = "convlib"
path = "src/lib.rs"
Anuncios

Antes de testearlo vamos a ver como quedo nuestra estructura del proyecto:

.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── lib.rs
│   ├── longitud.rs
│   ├── masa.rs
│   ├── temperatura.rs
│   └── volumen.rs
└── tests
    ├── lib.rs
    └── temperatura_test.rs
Anuncios

Ahora si para probarlo debemos usar el siguiente comando:

$ cargo test
Anuncios

Este comando nos devolvera algo similar esto:

tinchicus@dbn001vrt:~/lenguajes/rust/convlib$ cargo test
   Compiling convlib v0.1.0 (/home/tinchicus/lenguajes/rust/convlib)
    Finished test [unoptimized + debuginfo] target(s) in 4.12s
     Running unittests (target/debug/deps/convlib-e0ed65e39e3f17a4)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running tests/lib.rs (target/debug/deps/lib-6985d329838b1cd6)

running 2 tests
test temperatura_test::temperatura_test::test_kelvin_a_celsius_falla - should panic ... ok
test temperatura_test::temperatura_test::test_kelvin_a_celsius_pasa ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running tests/temperatura_test.rs (target/debug/deps/temperatura_test-b46179bb04795e01)

running 2 tests
test temperatura_test::test_kelvin_a_celsius_falla - should panic ... ok
test temperatura_test::test_kelvin_a_celsius_pasa ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests convlib

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/convlib$
Anuncios

Si ejecutan el comando cargo build no se vera afectado por el test que vimos porque como explicamos el atributo solo se ejecutara cuando hagamos los test por medio de cargo.

Anuncios

En resumen, hoy hemos visto como es la mecanica de un test para un crate, los atributos que estableceremos tanto en el nuevo codigo para verificarlo, asi como tambien las pequeñas modificaciones que debemos hacer para poder acceder a la libreria desde este, espero les haya sido de utilidad 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.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50