¿Por qué no se imprime? ¿Funciona en las pruebas unitarias de Rust?

Resuelto ruipacheco asked hace 10 años • 9 respuestas

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?

ruipacheco avatar Aug 03 '14 23:08 ruipacheco
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 --nocaptureopció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.

Vladimir Matveev avatar Aug 03 '2014 17:08 Vladimir Matveev

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
superlogical avatar Apr 13 '2015 02:04 superlogical