为什么不打印! 在Rustunit testing中工作?

我已经实现了以下方法和unit testing:

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

我这样运行unit testing:

 rustc --test app.rs; ./app 

我也可以运行这个

 cargo test 

我收到一条消息,说testing通过了,但是println! 从不显示在屏幕上。 为什么不?

发生这种情况是因为Rusttesting程序隐藏了成功testing的stdout,以便testing输出整齐。 您可以通过将--nocapture选项传递给testing二进制文件或cargo test来禁用此行为:

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

调用testing:

 % 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 

但是,如果testing失败,无论此选项是否存在,都将打印它们的stdout。

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 

testing时,不显示标准输出。 不要使用短信进行testing,但assert!assert_eq! ,并fail! 代替。 Rust的unit testing系统可以理解这些而不是短信。

即使出现问题,您所写的testing也会通过。 让我们看看为什么:

read_to_end的签名是fn read_to_end(&mut self) -> IoResult<Vec<u8>>

它返回一个IoResult来指示成功或错误。 这只是一个Result的typesdef,其错误值是一个IoError 。 由您来决定如何处理错误。 在这种情况下,我们希望任务失败,这是通过在Result上调用unwrap来完成的。

这将工作:

 let contents = File::open(&Path::new("message.txt")) .read_to_end() .unwrap(); 

unwrap不应该过度使用。

要使用println!()打印输出并保留testing结果的colornocapturecargo test使用colornocapture标志。

 $ cargo test -- --color always --nocapture 

(货运版本:每晚0.13.0)

Interesting Posts