我已经实现了以下方法和单元测试:
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!
从未显示在屏幕上。为什么不呢?
答案 0 :(得分:229)
这是因为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
但是,如果测试失败,无论是否存在此选项,都会打印出他们的标准输出。
答案 1 :(得分:58)
TL; DR
$ cargo test -- --nocapture
使用以下代码:
#[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);
}
然后运行以下命令:
$ cargo test -- --nocapture
你应该看到
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
答案 2 :(得分:5)
对于该问题的现在和将来的观看者,{@ {1}}是@ l-f在评论另一个答案时提到的方法。但这似乎是文档中所缺少的。
因此完整的命令是--show-output
答案 3 :(得分:4)
测试时,不显示标准输出。不要使用短信进行测试,而是使用assert!
,assert_eq!
和fail!
。 Rust的单元测试系统可以理解这些而不是短信。
即使出现问题,您所写的测试也会通过。让我们看看为什么:
read_to_end
的签名是
fn read_to_end(&mut self) -> IoResult<Vec<u8>>
返回IoResult
表示成功或错误。这只是Result
的类型def,其错误值为IoError
。由您来决定如何处理错误。在这种情况下,我们希望任务失败,这可以通过调用unwrap
上的Result
来完成。
这将有效:
let contents = File::open(&Path::new("message.txt"))
.read_to_end()
.unwrap();
unwrap
不应过度使用。
答案 4 :(得分:4)
要包含println!()
的打印输出并保留测试结果的颜色,请使用color
中的nocapture
和cargo test
标记。
$ cargo test -- --color always --nocapture
(货物版本:每晚0.13.0)