Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre esta macro.

Anuncios
Anuncios

Esta macro es provista por la libreria standard, esta es utilizada principal para asegurar que una condicion en un test es evaluada como true, esto lo hace mediante el argumento que le pasemos para ser evaluado, en caso de cumplirse como true este no hace nada y considera al test como pasado, en caso contrario si devuelve un false esta macro llama a panic lo cual hace que el test falle, por lo tanto podemos decir que esta macro sera para verificar que los test hacen lo que intentamos hacer. para ello vamos a tomar el ejemplo que creamos en el post anteror, sino lo tienen simplemente generen una libreria llamada prueba, iremos al archivo lib.rs y modificaremos el codigo existente con el siguiente:

lib.rs

#[derive(Debug)]
pub struct Rectangulo {
	longitud: u32,
	ancho: u32,
}

impl Rectangulo {
	pub fn puede_tener(&self, otro: &Rectangulo) -> bool {
		self.longitud > otro.longitud && self.ancho > otro.ancho
	}
}

#[cfg(test)]
mod tests {
	use super::*;

	#[test]
	fn chequeador()
	{
		let mas_grande = Rectangulo { longitud: 8, ancho: 7 };
		let mas_chico = Rectangulo { longitud: 5, ancho: 1 };

		assert!(mas_grande.puede_tener(&mas_chico));
	}
}
Anuncios
Anuncios

La primera modificacion es crear un codigo de depuracion, en este caso definimos un struct llamado Rectangulo con dos parametros, longitud y ancho, despues implementaremos una funcion llamada puede_tener, en esta recibiremos un argumento de tipo Rectangulo, este devolvera un booleano que sera el chequeo entre el rectangulo implementado y el pasado en el argumento, donde verificaremos si el implementado es mayor que el pasado.

Anuncios
Anuncios

Lo siguiente es el mod, la primera linea es para decirle que vamos a usar el modulo de base actual, dentro del atributo test agregaremos una nueva funcion llamada chequeador, en esta crearemos dos objetos de tipo Rectangulo, uno mas grande que otro, lo siguiente sera usar a assert donde chequearemos que tipo de valor obtendremos de la funcion puede_tener, en este caso pasamos al objeto mas chico para que nos devuelva un true y pasara el test, corramos 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::chequeador ... 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$
Anuncios

Como vemos funciono perfectamente porque como dijimos anteriormente al devolver true se supone que esta todo correcto y debe pasar el test, pero ahora vamos a tomar esta linea:

assert!(mas_grande.puede_tener(&mas_chico));
Anuncios

Y la modificaremos de la siguiente manera:

assert!(mas_chico.puede_tener(&mas_grande));
Anuncios

Compilemos 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.44s
     Running unittests (target/debug/deps/prueba-e23faeddfadd8fad)

running 1 test
test tests::chequeador ... FAILED

failures:

---- tests::chequeador stdout ----
thread 'main' panicked at 'assertion failed: mas_chico.puede_tener(&mas_grande)', src/lib.rs:23:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    tests::chequeador

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

Al hacer esta pequeña modificacion nos devolvera un false, dado que ahora sera mas chico y no lo puede contener, por lo tanto tenemos el FAILED y si observan el panic nos devolvio un assertion failed para informar el fallo del assert, vamos a hacer el ultimo cambio, para ello tomaremos la linea anterior:

assert!(mas_chico.puede_tener(&mas_grande));
Anuncios

Y la modificaremos de la siguiente manera:

assert!(!mas_chico.puede_tener(&mas_grande));
Anuncios

Si volvemos a correr el test obtendremos la siguiente 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.52s
     Running unittests (target/debug/deps/prueba-e23faeddfadd8fad)

running 1 test
test tests::chequeador ... 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$
Anuncios
Anuncios

Como pueden ver volvio a funcionar, esto es debido al operador de negacion (!) que esta delante del metodo , este operador invierte el valor booleano devuelto, es decir si es true sera false y viceversa, en este caso sigue devolviendo false pero gracias a este operador se convierte en true y por lo tanto pasa el assert y por lo tanto pasamos nuevamente el test, como pueden ver no necesariamente esta macro nos servira como una herramienta para verificar si un test es correcto o no pero esto no termina aca porque continuara en el proximo post.

Anuncios

En resumen, hoy hemos visto al macro assert, que es, como trabaja, como nos sirve para hacer nuestros test, como nos ayuda, como lo podemos aplicar a nuestros test, por ultimo como funciona y como falla, y como finalmente corregirlo, 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

Donación

Es para mantenimento del sitio, gracias!

$1.50