Rust 为什么';t println!在单元测试中工作?
我已经实现了以下方法和单元测试:Rust 为什么';t println!在单元测试中工作?,rust,println,Rust,Println,我已经实现了以下方法和单元测试: 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()
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——测试app.rs/应用程序
我也可以用
货物测试
我收到一条消息说测试通过了,但是
println代码>永远不会显示在屏幕上。为什么不呢?测试时,不显示标准输出。不要使用文本消息进行测试,而是assert代码>,assert\u eq代码>,和失败代码>取而代之。Rust的单元测试系统可以理解这些,但不能理解文本消息
即使出了问题,你写的测试也会通过。让我们看看原因:
从头到尾读取
的签名为
fn自始至终读取(&mut self)->IoResult
它返回一个IoResult
,以指示成功或错误。这只是结果的类型def,其错误值为IoError
。由您决定如何处理错误。在这种情况下,我们希望任务失败,这是通过调用结果
上的展开
来完成的
这将有助于:
let contents = File::open(&Path::new("message.txt"))
.read_to_end()
.unwrap();
但不应过度使用unwrap
。这是因为锈蚀测试程序隐藏了成功测试的标准,以便测试输出整洁。您可以通过将--nocapture
选项传递到测试二进制文件或货物测试来禁用此行为:
#[test]
fn test() {
println!("Hidden output")
}
调用测试:
%c—测试main.rs/主要的
运行1测试
测试测试。。。好啊
测试结果:可以。1人通过;0失败;忽略0;0测量
%/主-无捕获
运行1测试
隐藏输出
测试测试。。。好啊
测试结果:可以。1人通过;0失败;忽略0;0测量
%货物测试--nocapture
运行1测试
隐藏输出
测试测试。。。好啊
测试结果:可以。1人通过;0失败;忽略0;0测量
但是,如果测试失败,则无论此选项是否存在,都将打印其标准输出。TL;博士
$ 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
将打印输出包含在println!()
并保留测试结果的颜色,使用货物测试中的颜色
和无捕获
标志
$ cargo test -- --color always --nocapture
(cargo版本:0.13.0 nightly)正如,--显示输出是一条路要走
现在是
$cargo test--show输出
您提到要通过--nocapture
选项进行货物测试
,但货物对我来说无法识别此标志(使用rustup.sh的最新夜间版本)。“你确定它会起作用吗?”JimGarrison,确实如此。同时,您可以使用货物测试--nocapture
,它应该可以工作。谢谢!与这个问题无关,但这也帮助我找到了如何让货物测试[-]--工作台工作的方法@Nashenas,该选项被称为nocapture
,而不是no-capture
@namone2000——nocapture
在2018版中仍然有效<代码>--显示输出
是另一个以更容易查看的格式组织输出的选项。货物测试----无捕获
不再工作。我得到以下错误:线程“”在“无法识别的选项:\'no-capture\'”处惊慌失措,../src/libtest/lib.rs:249
我想知道这个问题是否是问题所在?正如前面的评论中指出的,选项是--nocapture
,而不是--no-capture
。然而,考虑到我们经常遇到的大多数命令行约定,这是一个非常明显的错误。我只是按照rust 1.1(cargo 0.2.0)中的回答使用了这个选项,它的工作原理与广告完全一样。