| # Testing | |
| This document contains the Moby code testing guidelines. It should answer any | |
| questions you may have as an aspiring Moby contributor. | |
| ## Test suites | |
| Moby has two test suites (and one legacy test suite): | |
| * Unit tests - use standard `go test` and | |
| [gotest.tools/assert](https://godoc.org/gotest.tools/assert) assertions. They are located in | |
| the package they test. Unit tests should be fast and test only their own | |
| package. | |
| * API integration tests - use standard `go test` and | |
| [gotest.tools/assert](https://godoc.org/gotest.tools/assert) assertions. They are located in | |
| `./integration/<component>` directories, where `component` is: container, | |
| image, volume, etc. These tests perform HTTP requests to an API endpoint and | |
| check the HTTP response and daemon state after the call. | |
| The legacy test suite `integration-cli/` is deprecated. No new tests will be | |
| added to this suite. Any tests in this suite which require updates should be | |
| ported to either the unit test suite or the new API integration test suite. | |
| ## Writing new tests | |
| Most code changes will fall into one of the following categories. | |
| ### Writing tests for new features | |
| New code should be covered by unit tests. If the code is difficult to test with | |
| unit tests, then that is a good sign that it should be refactored to make it | |
| easier to reuse and maintain. Consider accepting unexported interfaces instead | |
| of structs so that fakes can be provided for dependencies. | |
| If the new feature includes a completely new API endpoint then a new API | |
| integration test should be added to cover the success case of that endpoint. | |
| If the new feature does not include a completely new API endpoint consider | |
| adding the new API fields to the existing test for that endpoint. A new | |
| integration test should **not** be added for every new API field or API error | |
| case. Error cases should be handled by unit tests. | |
| ### Writing tests for bug fixes | |
| Bugs fixes should include a unit test case which exercises the bug. | |
| A bug fix may also include new assertions in existing integration tests for the | |
| API endpoint. | |
| ### Writing new integration tests | |
| Note the `integration-cli` tests are deprecated; new tests will be rejected by | |
| the CI. | |
| Instead, implement new tests under `integration/`. | |
| ### Integration tests environment considerations | |
| When adding new tests or modifying existing tests under `integration/`, testing | |
| environment should be properly considered. `skip.If` from | |
| [gotest.tools/skip](https://godoc.org/gotest.tools/skip) can be used to make the | |
| test run conditionally. Full testing environment conditions can be found at | |
| [environment.go](https://github.com/moby/moby/blob/6b6eeed03b963a27085ea670f40cd5ff8a61f32e/testutil/environment/environment.go) | |
| Here is a quick example. If the test needs to interact with a docker daemon on | |
| the same host, the following condition should be checked within the test code | |
| ```go | |
| skip.If(t, testEnv.IsRemoteDaemon()) | |
| // your integration test code | |
| ``` | |
| If a remote daemon is detected, the test will be skipped. | |
| ## Running tests | |
| ### Unit Tests | |
| To run the unit test suite: | |
| ``` | |
| make test-unit | |
| ``` | |
| or `hack/test/unit` from inside a `BINDDIR=. make shell` container or properly | |
| configured environment. | |
| The following environment variables may be used to run a subset of tests: | |
| * `TESTDIRS` - paths to directories to be tested, defaults to `./...` | |
| * `TESTFLAGS` - flags passed to `go test`, to run tests which match a pattern | |
| use `TESTFLAGS="-test.run TestNameOrPrefix"` | |
| ### Integration Tests | |
| To run the integration test suite: | |
| ``` | |
| make test-integration | |
| ``` | |
| This make target runs both the "integration" suite and the "integration-cli" | |
| suite. | |
| You can specify which integration test dirs to build and run by specifying | |
| the list of dirs in the TEST_INTEGRATION_DIR environment variable. | |
| You can also explicitly skip either suite by setting (any value) in | |
| TEST_SKIP_INTEGRATION and/or TEST_SKIP_INTEGRATION_CLI environment variables. | |
| Flags specific to each suite can be set in the TESTFLAGS_INTEGRATION and | |
| TESTFLAGS_INTEGRATION_CLI environment variables. | |
| If all you want is to specify a test filter to run, you can set the | |
| `TEST_FILTER` environment variable. This ends up getting passed directly to `go | |
| test -run` (or `go test -check-f`, depending on the test suite). It will also | |
| automatically set the other above mentioned environment variables accordingly. | |
| ### Go Version | |
| You can change a version of golang used for building stuff that is being tested | |
| by setting `GO_VERSION` variable, for example: | |
| ``` | |
| make GO_VERSION=1.12.8 test | |
| ``` |