Ergonomic CLI binary integration testing with fluent assertions on stdout, stderr, and exit code
cargo add philiprehberger-assert-cmdErgonomic CLI binary integration testing with fluent assertions on stdout, stderr, and exit code
[dependencies]
philiprehberger-assert-cmd = "0.2.0"
use philiprehberger_assert_cmd::cmd;
// Basic command assertion
cmd("echo")
.arg("hello world")
.run()
.unwrap()
.assert_success()
.assert_stdout_contains("hello");
// Chain multiple assertions
cmd("rustc")
.arg("--version")
.run()
.unwrap()
.assert_success()
.assert_exit_code(0)
.assert_stdout_contains("rustc")
.assert_stderr_is_empty();
// Environment variables and stdin
cmd("cat")
.stdin("input data\n")
.run()
.unwrap()
.assert_success()
.assert_stdout_equals("input data\n");
// Glob pattern matching
cmd("echo")
.arg("version 1.2.3")
.run()
.unwrap()
.assert_stdout_matches("version *");
| Method | Description |
|---|---|
cmd(program) | Create a new command builder |
Cmd::new(program) | Create a new command builder |
.arg(arg) | Append a single argument |
.args(&[args]) | Append multiple arguments |
.env(key, value) | Set an environment variable |
.stdin(data) | Pipe data to stdin |
.current_dir(dir) | Set the working directory |
.timeout(duration) | Set a timeout for execution |
.run() | Execute and return Result<CmdOutput, CmdError> |
| Method | Description |
|---|---|
.assert_success() | Exit code is 0 |
.assert_failure() | Exit code is non-zero |
.assert_exit_code(code) | Exit code matches exactly |
.assert_stdout_contains(s) | Stdout contains substring |
.assert_stdout_equals(s) | Stdout equals exactly |
.assert_stdout_is_empty() | Stdout is empty |
.assert_stdout_line_count(n) | Stdout has n lines |
.assert_stdout_matches(pat) | Stdout matches glob pattern (*, ?) |
.assert_stderr_contains(s) | Stderr contains substring |
.assert_stderr_equals(s) | Stderr equals exactly |
.assert_stderr_is_empty() | Stderr is empty |
.assert_stderr_matches(pat) | Stderr matches glob pattern (*, ?) |
.assert_stderr_line_count(n) | Stderr has n lines |
.assert_stdout_starts_with(s) | Stdout starts with prefix |
.assert_stdout_ends_with(s) | Stdout ends with suffix |
.assert_stderr_starts_with(s) | Stderr starts with prefix |
.assert_stderr_ends_with(s) | Stderr ends with suffix |
.stdout_lines() | Split stdout into Vec<&str> |
.stderr_lines() | Split stderr into Vec<&str> |
cargo test
cargo clippy -- -D warnings
If you find this project useful: