Contributing includes testing your changes. If you change the Moby code, you may need to add a new test or modify an existing test. Your contribution could even be adding tests to Moby. For this reason, you need to know a little about Moby's test infrastructure.
This section describes tests you can run in the dry-run-test
branch of your Docker fork. If you have followed along in this guide, you already have this branch. If you don't have this branch, you can create it or simply use another of your branches.
Moby tests use the Go language‘s test framework. In this framework, files whose names end in _test.go
contain test code; you’ll find test files like this throughout the Moby repo. Use these files for inspiration when writing your own tests. For information on Go‘s test framework, see Go’s testing package documentation and the go test help.
You are responsible for unit testing your contribution when you add new or change existing Moby code. A unit test is a piece of code that invokes a single, small piece of code (unit of work) to verify the unit works as expected.
Depending on your contribution, you may need to add integration tests. These are tests that combine two or more work units into one component. These work units each have unit tests and then, together, integration tests that test the interface between the components. The integration
and integration-cli
directories in the Docker repository contain integration test code.
Testing is its own specialty. If you aren't familiar with testing techniques, there is a lot of information available to you on the Web. For now, you should understand that, the Docker maintainers may ask you to write a new test or change an existing one.
Before submitting a pull request with a code change, you should run the entire Moby Engine test suite. The Makefile
contains a target for the entire test suite, named test
. Also, it contains several targets for testing:
Target | What this target does |
---|---|
test | Run the unit, integration, and docker-py tests |
test-unit | Run just the unit tests |
test-integration | Run the integration tests |
test-docker-py | Run the tests for the Docker API client |
Running the entire test suite on your current repository can take over half an hour. To run the test suite, do the following:
Open a terminal on your local host.
Change to the root of your Docker repository.
$ cd moby-fork
Make sure you are in your development branch.
$ git checkout dry-run-test
Run the make test
command.
$ make test
This command does several things, it creates a container temporarily for testing. Inside that container, the make
:
It can take approximate one hour to run all the tests. The time depends on your host performance. The default timeout is 60 minutes, which is defined in hack/make.sh
(${TIMEOUT:=60m}
). You can modify the timeout value on the basis of your host performance. When they complete successfully, you see the output concludes with something like this:
Ran 68 tests in 79.135s
If you are working inside a development container, you use the hack/make.sh
script to run tests. The hack/make.sh
script doesn't have a single target that runs all the tests. Instead, you provide a single command line with multiple targets that does the same thing.
Try this now.
Open a terminal and change to the moby-fork
root.
Start a Moby development image.
If you are following along with this guide, you should have a dry-run-test
image.
$ docker run --privileged --rm -ti -v `pwd`:/go/src/github.com/moby/moby dry-run-test /bin/bash
Run the tests using the hack/make.sh
script.
root@5f8630b873fe:/go/src/github.com/moby/moby# hack/make.sh dynbinary binary cross test-unit test-integration test-docker-py
The tests run just as they did within your local host.
Of course, you can also run a subset of these targets too. For example, to run just the unit tests:
root@5f8630b873fe:/go/src/github.com/moby/moby# hack/make.sh dynbinary binary cross test-unit
Most test targets require that you build these precursor targets first: dynbinary binary cross
We use golang standard testing package or gocheck for our unit tests.
You can use the TESTDIRS
environment variable to run unit tests for a single package.
$ TESTDIRS='opts' make test-unit
You can also use the TESTFLAGS
environment variable to run a single test. The flag's value is passed as arguments to the go test
command. For example, from your local host you can run the TestBuild
test with this command:
$ TESTFLAGS='-test.run ^TestValidateIPAddress$' make test-unit
On unit tests, it's better to use TESTFLAGS
in combination with TESTDIRS
to make it quicker to run a specific test.
$ TESTDIRS='opts' TESTFLAGS='-test.run ^TestValidateIPAddress$' make test-unit
We use gocheck for our integration-cli tests. You can use the TESTFLAGS
environment variable to run a single test. The flag's value is passed as arguments to the go test
command. For example, from your local host you can run the TestBuild
test with this command:
$ TESTFLAGS='-check.f DockerSuite.TestBuild*' make test-integration
To run the same test inside your Docker development container, you do this:
root@5f8630b873fe:/go/src/github.com/moby/moby# TESTFLAGS='-check.f TestBuild*' hack/make.sh binary test-integration
This explains how to test the Windows binary on a Windows machine set up as a development environment. The tests will be run against a daemon running on a remote Linux machine. You'll use Git Bash that came with the Git for Windows installation. Git Bash, just as it sounds, allows you to run a Bash terminal on Windows.
If you don't have one open already, start a Git Bash terminal.
Change to the moby
source directory.
$ cd /c/gopath/src/github.com/moby/moby
Set DOCKER_REMOTE_DAEMON
as follows:
$ export DOCKER_REMOTE_DAEMON=1
Set DOCKER_TEST_HOST
to the tcp://IP_ADDRESS:2376
value; substitute your Linux machines actual IP address. For example:
$ export DOCKER_TEST_HOST=tcp://213.124.23.200:2376
Make the binary and run the tests:
$ hack/make.sh binary test-integration
Some tests are skipped on Windows for various reasons. You can see which tests were skipped by re-running the make and passing in the TESTFLAGS='-test.v'
value. For example
$ TESTFLAGS='-test.v' hack/make.sh binary test-integration
Should you wish to run a single test such as one with the name ‘TestExample’, you can pass in TESTFLAGS='-check.f TestExample'
. For example
$ TESTFLAGS='-check.f TestExample' hack/make.sh binary test-integration
You can now choose to make changes to the Moby source or the tests. If you make any changes, just run these commands again.
Congratulations, you have successfully completed the basics you need to understand the Moby test framework.