Rust のユニットテストで println! が機能しないのはなぜですか? 質問する

Rust のユニットテストで println! が機能しないのはなぜですか? 質問する

次のメソッドとユニット テストを実装しました。

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

ユニットテストは次のように実行します。

rustc --test app.rs; ./app

これを実行することもできます

cargo test

テストに合格したというメッセージが返されますが、println!画面には表示されません。なぜでしょうか?

ベストアンサー1

これは、Rust テスト プログラムがテスト出力を整理するために成功したテストの stdout を非表示にするために発生します。この--nocaptureオプションをテスト バイナリまたはcargo test(ただし、この場合は --– 以下を参照)に渡すことで、この動作を無効にすることができます。

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

テストの呼び出し:

% 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

ただし、テストが失敗した場合は、このオプションが存在するかどうかに関係なく、標準出力が印刷されます。

おすすめ記事