tag manager google rust println

rust - google tag manager



¿Por qué no println! trabajar en pruebas de la unidad de óxido? (4)

Durante la prueba, no se muestra la salida estándar. ¡No use mensajes de texto para probar pero assert! , assert_eq! ¡y fail! en lugar. El sistema de prueba unitaria de Rust puede entender estos, pero no mensajes de texto.

La prueba que ha escrito pasará incluso si algo sale mal. Veamos por qué:

La firma de fn read_to_end(&mut self) -> IoResult<Vec<u8>> es fn read_to_end(&mut self) -> IoResult<Vec<u8>>

Devuelve un IoResult para indicar éxito o error. Esto es solo un tipo def para un Result cuyo valor de error es un IoError . Depende de usted decidir cómo se debe manejar un error. En este caso, queremos que la tarea falle, lo que se hace al invocar unwrap en el Result .

Esto funcionará:

let contents = File::open(&Path::new("message.txt")) .read_to_end() .unwrap();

unwrap no debe ser usado en exceso sin embargo.

Implementé el siguiente método y prueba de unidad:

use std::fs::File; use std::path::Path; use std::io::prelude::*; fn read_file(path: &Path) { let mut file = File::open(path).unwrap(); let mut contents = String::new(); file.read_to_string(&mut contents).unwrap(); println!("{}", contents); } #[test] fn test_read_file() { let path = &Path::new("/etc/hosts"); println!("{:?}", path); read_file(path); }

Ejecuto la prueba de la unidad de esta manera:

rustc --test app.rs; ./app

También podría ejecutar esto con

cargo test

Recibo un mensaje diciendo que la prueba pasó, pero la println! nunca se muestra en la pantalla. Por qué no?


Esto sucede porque los programas de prueba de óxido ocultan la salida estándar de pruebas exitosas para que la salida de prueba esté ordenada. Puede desactivar este comportamiento pasando la opción --nocapture al test binario o cargo test :

#[test] fn test() { println!("Hidden output") }

Invocando pruebas:

% rustc --test main.rs; ./main running 1 test test test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured % ./main --nocapture running 1 test Hidden output test test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured % cargo test -- --nocapture running 1 test Hidden output test test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

Si las pruebas fallan, sin embargo, su salida estándar se imprimirá independientemente de si esta opción está presente o no.


Para incluir impresiones con println!() Y conservar los colores para los resultados de la prueba, use los indicadores de color y nocapture en cargo test .

$ cargo test -- --color always --nocapture

(versión de carga: 0.13.0 cada noche)


TL; DR

$ cargo test -- --nocapture

Con el siguiente código:

#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum PieceShape { King, Queen, Rook, Bishop, Knight, Pawn } fn main() { println!("Hello, world!"); } #[test] fn demo_debug_format() { let q = PieceShape::Queen; let p = PieceShape::Pawn; let k = PieceShape::King; println!("q={:?} p={:?} k={:?}", q, p, k); }

Luego ejecuta lo siguiente:

$ cargo test -- --nocapture

Y deberías ver

Running target/debug/chess-5d475d8baa0176e4 running 1 test q=Queen p=Pawn k=King test demo_debug_format ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured