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
pre> 我收到一条消息,说测试已通过,但
println!
从未显示在屏幕上。为什么不呢?#1 楼
发生这种情况是因为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
但是,如果测试失败,则无论此选项是否存在,都将打印其标准输出。
#2 楼
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
评论
货物测试--无法捕获不再有效。我收到以下错误:线程'
– Nasenas
15年7月15日在17:50
我想知道这个问题github.com/rust-lang/cargo/issues/1377是问题吗?
–超逻辑的
15年7月16日在20:55
正如前面的评论中指出的那样,该选项是--nocapture,而不是--no-capture。但是,对于给定的大多数我们倾向于遇到的命令行约定,这是一个完全显而易见的错误。我只是完全按照rust 1.1(货物0.2.0)中的答案中的描述使用了此选项,它的工作方式与广告中所述的完全一样。
– Glenn McAllister
15年7月30日在18:32
#3 楼
要在println!()
中包含打印输出并保留测试结果的颜色,请在color
中使用nocapture
和cargo test
标志。$ cargo test -- --color always --nocapture
(货物版本:每晚0.13.0)
#4 楼
对于此问题的现在和将来的观看者,@ l-f在评论另一个答案时提到的方法是--show-output
。但是它似乎从文档中丢失了。所以完整的命令是
cargo test -- --show-output
#5 楼
测试期间,不显示标准输出。不要使用短信进行测试,而是使用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
不应过度使用。
评论
您提到了将--nocapture选项传递给货运测试,但货运对我来说不识别此标志(使用rustup.sh的最新夜间报告)。您确定它应该工作吗?
–吉姆·加里森(Jim Garrison)
2014年8月9日在2:35
@JimGarrison,确实存在一个问题。同时,您可以使用货物测试--不捕获,它应该可以工作。
–弗拉基米尔·马特维耶夫(Vladimir Matveev)
2014年8月9日在8:13
谢谢!与这个问题无关,但这也帮助我弄清楚了如何进行货物测试[-] --bench也可以工作!
–吉姆·加里森(Jim Garrison)
2014年8月9日12:37
@Nashenas,该选项称为nocapture,而不是nocapture。
–弗拉基米尔·马特维耶夫(Vladimir Matveev)
15年7月16日在5:21
@ Anonyme2000 --nocapture在2018版中仍然有效。 --show-output是另一个选项,它以更易于查看的格式组织输出。
– L. F.
20 Sep 13'1:35