¿Por qué no se imprime? ¿Funciona en las pruebas unitarias de Rust?
Implementé el siguiente método y prueba unitaria:
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 unitaria de esta manera:
rustc --test app.rs; ./app
También podría ejecutar esto con
cargo test
Recibo un mensaje que dice que la prueba pasó pero println!
nunca aparece en la pantalla. ¿Por qué no?
Aceptado
Esto sucede porque los programas de prueba de Rust ocultan la salida estándar de las pruebas exitosas para que el resultado de la prueba esté ordenado. Puede desactivar este comportamiento pasando la --nocapture
opción al binario de prueba o a cargo test
(pero, en este caso, después --
, consulte a continuación):
#[test]
fn test() {
println!("Hidden output")
}
Invocar 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
Sin embargo, si las pruebas fallan, se imprimirá su salida estándar independientemente de si esta opción está presente o no.
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 ejecute 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