为什么不打印! 在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结果的color
, nocapture
在cargo test
使用color
和nocapture
标志。
$ cargo test -- --color always --nocapture
(货运版本:每晚0.13.0)