10 releases (5 stable)

2.0.0 Mar 16, 2024
1.0.3 Dec 8, 2022
1.0.2 Mar 29, 2022
1.0.1 Jun 25, 2021
0.0.2 Jun 19, 2021

#290 in Testing


Used in testcall

MIT/Apache

17KB
248 lines

Testing the executables build by a bin crate.

Description

cargo test has no support for running tests on a build excecutable. This crate works around this deficiency.

How It Works

There are some problems to overcome the cargo limitations.

  1. Running cargo tests does not depend on the executables to be build, by default they are not compiled at test time.
  2. There are no standard facilities to locate and execute them in a test.

BinTest solve these problems by running cargo build at test time, parsing its output for identifying and locating the build executables. On request it creates a std::process::Command for the binary which can be used for any further testing.


lib.rs:

Example

In simple cases you can just call BinTest::new() to build all executables in the current crate and get a reference to a BinTest singleton to work with.

#[test]
fn test() {
  // BinTest::new() will run 'cargo build' and registers all build executables
  let executables: &'static BinTest = BinTest::new();

  // List the executables build
  for (k,v) in executables.list_executables() {
    println!("{} @ {}", k, v);
  }

  // BinTest::command() looks up executable by its name and creates a process::Command from it
  let command = executables.command("name");

  // this command can then be used for testing
  command.arg("help").spawn();
}

In more complex cases you can use the BinTest::with() to configure the build process with a BinTestBuilder and then call .build() on it to get a reference to the BinTest singleton.

See also

The testcall crate uses this to build tests and assertions on top of the commands created by bintest. The testpath crate crate lets you run test in specially created temporary directories to provide an filesystem environment for tests.

Dependencies

~1–2MB
~39K SLoC