12 releases

0.4.0 Oct 20, 2023
0.3.1 Jul 21, 2022
0.3.0 Apr 20, 2022
0.2.1 Mar 4, 2021
0.0.2 Oct 25, 2019

#57 in Testing

Download history 1485/week @ 2023-12-13 1715/week @ 2023-12-20 1222/week @ 2023-12-27 1016/week @ 2024-01-03 592/week @ 2024-01-10 770/week @ 2024-01-17 761/week @ 2024-01-24 590/week @ 2024-01-31 1425/week @ 2024-02-07 1111/week @ 2024-02-14 999/week @ 2024-02-21 1248/week @ 2024-02-28 837/week @ 2024-03-06 1209/week @ 2024-03-13 1296/week @ 2024-03-20 1185/week @ 2024-03-27

4,741 downloads per month
Used in 13 crates (9 directly)

MIT license

210KB
4K SLoC

dockertest-rs

Control docker containers from a Rust integration test suite. Full fledge management support with automatic cleanup.

This crate provides the following features for your docker testing needs:

  • Ensure docker containers are invoked and running according to WaitFor strategy.
  • Customize your own or use one of the batteries included.
  • Interact with the RunningContainer in the test body through its ip address.
  • Setup inter-container communication with inject_container_name into environment variables.
  • Teardown each started container after test is terminated - both successfully and on test failure.
  • Concurrent capabilities. All tests are isolated into separate networks per test, with uniquely generated container names.

See the crate documentation for extensive explanations.

Example

This is a trivial example showing of the general structure of a naive test.

use dockertest::{DockerTest, TestBodyContainer};
use std::sync::{Arc, Mutex};

#[test]
fn hello_world_test() {
   // Define our test instance, will pull images from dockerhub.
   let mut test = DockerTest::new().with_default_source(DockerHub);

   // Construct the container specification to be added to the test.
   //
   // A container specification can have multiple properties, depending on how the
   // lifecycle management of the container should be handled by dockertest.
   //
   // For any container specification where dockertest needs to create and start the container,
   // we must provide enough information to construct a composition of
   // an Image configured with provided environment variables, arguments, StartPolicy, etc.
   let hello = TestBodyContainer::with_repository("hello-world");

   // Populate the test instance.
   // The order of compositions added reflect the execution order (depending on StartPolicy).
   test.provide_container(hello);

   let has_ran: Arc<Mutex<bool>> = Arc::new(Mutex::new(false));
   let has_ran_test = has_ran.clone();
   test.run(|ops| async move {
       // A handle to operate on the Container.
       let _container = ops.handle("hello-world");

       // The container is in a running state at this point.
       // Depending on the Image, it may exit on its own (like this hello-world image)
       let mut ran = has_ran_test.lock().unwrap();
       *ran = true;
   });

   let ran = has_ran.lock().unwrap();
   assert!(*ran);
}

Testing

Testing this library requires the following:

  • docker daemon available on localhost.
  • Set DOCKERTEST_BUILD_TEST_IMAGES=1 in your environment, will trigger the test images to be built.

Tests are designed to be run in parallel, and should not conflict with existing system images. Local images are build with repository prefix dockertest-rs/.

Running dockertest inside docker

To run dockertest inside docker you will have to set the following environment variable:

  • DOCKERTEST_CONTAINER_ID_INJECT_TO_NETWORK=your_container_id/name

DOCKERTEST_CONTAINER_ID_INJECT_TO_NETWORK has to be set to the ID or name of the container dockertest is running in.

Dependencies

~12–27MB
~403K SLoC