如何使用assert_cli crate获取进程的命令标准输出?
获取assert_cli命令的原始输出用于复杂校验
我完全懂你的需求——assert_cli在简单断言场景下用着特别顺手,但要做正则匹配、JSON解析这类复杂验证时,确实得拿到原始的输出字符串才行。其实assert_cli本身就提供了获取完整输出的途径,不用额外绕弯子。
你可以通过Assert::execute()方法执行命令并捕获完整输出结果,这个方法会返回一个Result<Output, Error>,其中Output结构体包含了命令的标准输出、标准错误以及退出码。下面把你的示例改成能获取输出的版本:
extern crate assert_cli; // 如果需要正则校验,需引入regex crate // extern crate regex; use assert_cli::Assert; // use regex::Regex; fn main() { // 执行命令并获取结果 let output = Assert::command(&["echo", "foo-bar-foo"]) .execute() .expect("命令执行失败"); // 将stdout字节数组转成String(注意处理UTF-8转换错误) let stdout_str = String::from_utf8(output.stdout) .expect("输出不是有效的UTF-8字符串"); // 现在可以做任意复杂检查了,比如正则匹配 // let re = Regex::new(r"foo-\w+-foo").unwrap(); // assert!(re.is_match(&stdout_str.trim())); // 或者验证JSON输出(假设命令输出是JSON格式) // let parsed_json: serde_json::Value = serde_json::from_str(&stdout_str).unwrap(); // assert_eq!(parsed_json["key"], "expected_value"); println!("命令输出: {}", stdout_str); }
关键点说明:
execute()不会自动断言命令成功,所以需要自行处理错误(用expect或match);如果要确保命令成功退出,可以在execute()前调用assert(),或者拿到结果后检查output.status.success()。output.stdout和output.stderr都是Vec<u8>类型,需要用String::from_utf8转换为字符串,记得处理转换失败的情况(比如输出包含非UTF-8字节)。- 拿到字符串后,就能自由使用Rust各类库做复杂验证了——不管是正则、JSON解析,还是自定义字符串逻辑检查都没问题。
如果是在测试函数里使用,写法类似,只需把main换成#[test]标注的函数:
#[test] fn test_cli_output() { let output = Assert::command(&["my_cli_app", "--test-arg"]) .execute() .expect("测试命令执行失败"); let stdout = String::from_utf8(output.stdout).unwrap(); assert!(stdout.contains("expected_content")); // 其他复杂校验逻辑... }
这样就能满足你对输出做深度检查的需求啦!
内容的提问来源于stack exchange,提问作者Logan Reed
相关产品推荐
相关产品推荐

