623 Stimmen

Warum funktioniert println! nicht in Rust-Einheitstests?

Ich habe die folgende Methode und den Unittest implementiert:

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);
}

Ich führe den Unittest auf folgende Weise aus:

rustc --test app.rs; ./app

Ich könnte es auch so ausführen

cargo test

Ich erhalte eine Nachricht, dass der Test bestanden hat, aber das println!-Statement wird nie auf dem Bildschirm angezeigt. Warum nicht?

5voto

Colin Woodbury Punkte 1719

Beachten Sie, dass die moderne Lösung (cargo test -- --show-output) nicht in Doctests funktioniert, die in einem Markdown-Codezaun im Docstring Ihrer Funktionen definiert sind. Nur println! (usw.) Anweisungen, die in einem konkreten #[test] Block gemacht werden, werden respektiert.

5voto

AlexaP Punkte 141

Es ist wahrscheinlich, dass die Testausgabe vom Testframework erfasst und nicht auf die Standardausgabe gedruckt wird. Wenn Sie Tests mit cargo test ausführen, wird die Ausgabe jedes Tests erfasst und nur angezeigt, wenn der Test fehlschlägt. Wenn Sie die Ausgabe eines Tests sehen möchten, können Sie die --nocapture-Flagge verwenden, wenn Sie den Test mit cargo test ausführen. So:

cargo test -- --nocapture

Oder Sie können das println!-Makro innerhalb einer Testfunktion verwenden, um die Ausgabe auf die Standardausgabe zu drucken. So:

 #[test]
 fn test_read_file() {
    let path = &Path::new("/etc/hosts");
    println!("{:?}", path);
    read_file(path);
    println!("Der Test war erfolgreich!");
}

2voto

Caridorc Punkte 3671

Wenn Sie den Test ausführen möchten und jedes Mal die Ausgabe angezeigt werden soll, wenn sich die Datei ändert:

cargo watch -x "test -- --nocapture"

0voto

blacha Punkte 121

Warum? Ich weiß es nicht, aber es gibt einen kleinen Hack eprintln!("wird in {}", "Tests")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X