You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:09:02