assertables 9.8.3

Assertables: assert macros for better testing, debugging, quality assurance, and runtime reliability.
Documentation
<!--
tags: #assert #assertion #rust #testing #macros #tdd #testdrivendevelopment
-->

# Assertables: assert macros for better testing

Assertables is a Rust crate of assert macros to improve your compile-time tests and run-time reliability.

**[documentation](https://docs.rs/assertables/)**
•
**[source](https://github.com/sixarm/assertables-rust-crate/)**
•
**[llms.txt](https://raw.githubusercontent.com/sixarm/assertables-rust-crate/refs/heads/main/llms.txt)**
•
**[crate](https://crates.io/crates/assertables)**
•
**[email](mailto:joel@joelparkerhenderson.com)**

## Introduction

The Assertables Rust crate provides many assert macros that can help you
develop, test, and debug.

This documentation is also available as
[llms.txt](https://github.com/sixarm/assertables-rust-crate/llms.txt).

* Test values with
  [assert_lt]https://docs.rs/assertables/9.8.3/assertables/assert_lt,
  [assert_gt]https://docs.rs/assertables/9.8.3/assertables/assert_gt,
  [assert_in]https://docs.rs/assertables/9.8.3/assertables/assert_in,
  []https://docs.rs/assertables
* Test groups with
  [assert_all]https://docs.rs/assertables/9.8.3/assertables/assert_all,
  [assert_any]https://docs.rs/assertables/9.8.3/assertables/assert_any,
  [assert_iter]https://docs.rs/assertables/9.8.3/assertables/assert_iter,
  []https://docs.rs/assertables
* Test wrappers with
  [assert_ok]https://docs.rs/assertables/9.8.3/assertables/assert_ok,
  [assert_some]https://docs.rs/assertables/9.8.3/assertables/assert_some,
  [assert_ready]https://docs.rs/assertables/9.8.3/assertables/assert_ready,
  []https://docs.rs/assertables
* Test matching with
  [assert_matches]https://docs.rs/assertables/9.8.3/assertables/assert_matches,
  [assert_is_match]https://docs.rs/assertables/9.8.3/assertables/assert_is_match,
  []https://docs.rs/assertables
* Test nearness with
  [assert_approx]https://docs.rs/assertables/9.8.3/assertables/assert_approx,
  [assert_abs_diff]https://docs.rs/assertables/9.8.3/assertables/assert_abs_diff,
  []https://docs.rs/assertables/
* Test programs with
  [assert_command]https://docs.rs/assertables/9.8.3/assertables/assert_command,
  [assert_status]https://docs.rs/assertables/9.8.3/assertables/assert_staus,
  []https://docs.rs/assertables
* Many more below.

To use this crate, add it to your file `Cargo.toml`:

```toml
assertables = "9.8.3"
```

Benefits:

* You can write better tests to improve reliability and maintainability.
* You can handle more corner cases without needing to write custom code.
* You can troubleshoot faster because error messages show more detail.

Learning:
[FAQ](https://github.com/SixArm/assertables-rust-crate/tree/main/help/faq),
[docs](https://docs.rs/assertables/),
[examples](https://github.com/SixArm/assertables-rust-crate/blob/main/tests/examples/),
[changes](https://github.com/SixArm/assertables-rust-crate/tree/main/CHANGES.md),
[upgrades](https://github.com/SixArm/assertables-rust-crate/tree/main/help/upgrades/upgrade-from-version-8-to-9),
[developing](https://github.com/SixArm/assertables-rust-crate/tree/main/help/developing/).

Comparisons:
[more_asserts](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/more_asserts),
[cool_asserts](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/cool_asserts),
[assert2](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/assert2),
[claims](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons/claims),
[etc.](https://github.com/SixArm/assertables-rust-crate/tree/main/help/comparisons)

## Examples

Examples with numbers:

```rust
let i = 1;
assert_lt!(i, 2);
assert_in_range!(&i, 0..2);
```

Examples with strings:

```rust
let s = "hello";
assert_starts_with!(s, "h");
assert_is_match!(Regex::new(r"e.*o").unwrap(), s);
```

Examples with arrays:

```rust
let a = [1, 2, 3];
assert_contains!(a, &2);
assert_all!(a.into_iter(), |i: i32| i < 4);
```

## Highlights

Values:

* [`assert_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_eq/
* [`assert_ne!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_ne/
* [`assert_ge!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_ge/
* [`assert_gt!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_gt/
* [`assert_le!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_le/
* [`assert_lt!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_lt/

Floats:

* [`assert_f32_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_f32/assert_f32_eq/
* [`assert_f64_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_f64/assert_f64_eq/

Nearness:

* [`assert_approx_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_approx/assert_approx_eq/
* [`assert_in_delta!(a, b, delta)`]https://docs.rs/assertables/9.8.3/assertables/assert_in/assert_in_delta/
* [`assert_in_epsilon!(a, b, epsilon)`]https://docs.rs/assertables/9.8.3/assertables/assert_in/assert_in_epsilon/
* [`assert_in_range!(a, range)`]https://docs.rs/assertables/9.8.3/assertables/assert_in/assert_in_range/
* [`assert_diff_eq_x!(a, b, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_diff/assert_diff_eq_x/
* [`assert_abs_diff_eq_x!(a, b, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_abs_diff/assert_abs_diff_eq_x/

Groups:

* [`assert_all!(group, predicate)`]https://docs.rs/assertables/9.8.3/assertables/assert_all/
* [`assert_any!(group, predicate)`]https://docs.rs/assertables/9.8.3/assertables/assert_any/
* [`assert_is_empty!(group)`]https://docs.rs/assertables/9.8.3/assertables/assert_is_empty/assert_is_empty/
* [`assert_len_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_len/assert_len_eq/
* [`assert_count_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_count/assert_count_eq/

Matching:

* [`assert_starts_with!(sequence, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_starts_with/
* [`assert_ends_with!(sequence, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_ends_with/
* [`assert_contains!(container, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_contains/
* [`assert_is_match!(matcher, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_is_match/
* [`assert_matches!(expr, pattern)`]https://docs.rs/assertables/9.8.3/assertables/assert_matches/
* [`assert_email_address!(string)`]https://docs.rs/assertables/9.8.3/assertables/assert_email_address/

Results:

* [`assert_ok!(result)`]https://docs.rs/assertables/9.8.3/assertables/assert_ok/
* [`assert_ok_eq_x!(result, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_ok/assert_ok_eq_x/
* [`assert_ok_ne_x!(result, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_ok/assert_ok_ne_x/
* [`assert_err!(result)`]https://docs.rs/assertables/9.8.3/assertables/assert_err/

Options:

* [`assert_some!(option)`]https://docs.rs/assertables/9.8.3/assertables/assert_some/
* [`assert_some_eq_x!(option, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_some/assert_some_eq_x/
* [`assert_some_ne_x!(option, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_some/assert_some_ne_x/
* [`assert_none!(option)`]https://docs.rs/assertables/9.8.3/assertables/assert_none/

Polls:

* [`assert_ready!(poll)`]https://docs.rs/assertables/9.8.3/assertables/assert_ready/
* [`assert_ready_eq_x!(poll, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_ready/assert_ready_eq_x/
* [`assert_ready_ne_x!(poll, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_ready/assert_ready_ne_x/
* [`assert_pending!(poll)`]https://docs.rs/assertables/9.8.3/assertables/assert_pending/

Readers:

* [`assert_fs_read_to_string_eq_x!(path, x`]https://docs.rs/assertables/9.8.3/assertables/assert_fs_read_to_string/
* [`assert_io_read_to_string_eq_x!(reader, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_io_read_to_string/

Iterators:

* [`assert_iter_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_iter/assert_iter_eq/
* [`assert_iter_ne!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_iter/assert_iter_ne/
* [`assert_iter_ge!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_iter/assert_iter_ge/
* [`assert_iter_gt!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_iter/assert_iter_gt/
* [`assert_iter_le!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_iter/assert_iter_le/
* [`assert_iter_lt!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_iter/assert_iter_lt/

Sets:

* [`assert_set_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_set/assert_set_eq/
* [`assert_set_ne!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_set/assert_set_ne/
* [`assert_set_subset!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_set/assert_set_subset/
* [`assert_set_superset!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_set/assert_set_superset/

Bags:

* [`assert_bag_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_bag/assert_bag_eq/
* [`assert_bag_ne!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_bag/assert_bag_ne/
* [`assert_bag_subbag!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_bag/assert_bag_subbag/
* [`assert_bag_superbag!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/assert_bag/assert_bag_superbag/

Commands:

* [`assert_command_stdout_eq_x!(command, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_command/
* [`assert_program_args_stdout_eq_x!(program, args, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_program_args/

Status:

* [`assert_status_success!(a)`]https://docs.rs/assertables/9.8.3/assertables/assert_status/assert_status_success/
* [`assert_status_code_value_eq_x!(a, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_status/assert_status_code_value_eq_x/
* [`assert_status_code_value_ne_x!(a, x)`]https://docs.rs/assertables/9.8.3/assertables/assert_status/assert_status_code_value_ne_x/
* [`assert_status_failure!(a)`]https://docs.rs/assertables/9.8.3/assertables/assert_status/assert_status_failure/

Infix values:

* [`assert_infix!(a == b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a != b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a < b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a <= b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a > b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a >= b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/

Infix logic:

* [`assert_infix!(a & b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a | b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a ^ b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a && b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/
* [`assert_infix!(a || b)`]https://docs.rs/assertables/9.8.3/assertables/assert_infix/

For a complete list of modules and macros, see the [docs](https://docs.rs/assertables/).

## Forms

All the macros have forms for an optional message:

* [`assert_gt!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_gt.html `// default message`
* [`assert_gt!(a, b, "your text")`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_gt.html `// custom message`

All the macros have forms for different outcomes:

* [`assert_gt!(1, 2)`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_gt.html `// panic`
* [`assert_gt_as_result!(1, 2)`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_gt_as_result.html `return Result`
* [`debug_assert_gt!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/macro.debug_assert_gt.html `// panic in debug mode`

Many of the macros have a form "compare left item to right item" that compares
items of the same kind, and a form "compare left item to right expression" that
compares one item to any arbitrary expression:

* [`assert_len_eq!(a, b)`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_ok_eq.html `// a.len() = b.len()`
* [`assert_len_eq_x!(a, x)`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_ok_eq_x.html `// a.len() = x`

Many of the macros has a "success return", which means the macro returns data that you can optionally use for more testing.

* [`let inner = assert_ok!(result)`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_ok.html
* [`let string = assert_fs_read_to_string_ne!("alfa.txt", "")`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_fs_read_to_string_ne.html
* [`let stdout = assert_command_stdout_gt!("ls", vec![b' '])`]https://docs.rs/assertables/9.8.3/assertables/macro.assert_command_stdout_gt.html

## Tracking

* Package: assertables-rust-crate
* Version: 9.8.3
* Created: 2021-03-30T15:47:49Z
* Updated: 2025-12-16T04:16:24Z
* License: MIT or Apache-2.0 or GPL-2.0 or GPL-3.0 or contact us for more
* Contact: Joel Parker Henderson <joel@joelparkerhenderson.com>