1. ホーム
  2. rust

[解決済み] Rustのユニットテストでprintln! が動作しないのはなぜ?

2022-03-23 21:27:43

質問

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

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! が画面に表示されない。なぜでしょうか?

解決方法は?

これは、Rust のテストプログラムが、テスト出力を整頓するために、成功したテストの標準出力を隠してしまうために起こります。この挙動を無効にするには --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

ただし、テストが失敗した場合は、このオプションがあるかどうかにかかわらず、その標準出力が表示されます。