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

如何为使用structopt构建的Rust CLI工具编写测试

为基于StructOpt的Rust CLI工具编写测试

我用StructOpt构建了一个小型Rust CLI工具,想要给它添加测试,但没找到可用的文档或示例。

工具核心代码

use structopt::StructOpt;

#[derive(Debug, StructOpt)]
#[structopt(name = "example")]
struct Cli {
    domain: String,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let args = Cli::from_args();

    let url = format!("https://example.com/{}", args.domain);
    let resp = ureq::get(&url.to_string()).call().into_json()?;

    println!("Has data for domain: {}", args.domain);
    Ok(())
}

最初的测试设想

我原本想写出类似这样的测试代码:

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn valid_domain() {
        // 设想中的调用方式
        let cli = Cli::build_command(domain: "google.com");
        let output = cli.run_command();

        assert!(output.contains("Has data"));
    }
}

最终解决方案:使用assert_cmd crate

后来我用assert_cmd crate解决了问题,以下是部分测试代码:

mod tests {
    use assert_cmd::Command;

    #[test]
    fn valid_domain() {
        let mut cmd = Command::cargo_bin("example").unwrap();
        let output = cmd.arg("google.com").unwrap();
        let output_str = String::from_utf8(output.stdout).unwrap();
        assert!(output_str.contains("Has data"));
    }

    #[test]
    #[should_panic(expected = "Invalid domain")]
    fn invalid_domain() {
        Command::cargo_bin("example").unwrap().arg("google").unwrap();
    }
}

内容的提问来源于stack exchange,提问作者Thong Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:13:15