Skip to content

Latest commit

 

History

History

test

Tests

To run tests:

# Land the latest code
ko apply -f ./config/

# Run unit tests
go test ./...

# Run integration tests (against your current kube cluster)
go test -v -count=1 -tags=e2e -timeout=20m ./test

Unit tests

Unit tests live side by side with the code they are testing and can be run with:

go test ./...

By default go test will not run the end to end tests, which need -tags=e2e to be enabled.

End to end tests

Setup

Environment variables used by end to end tests:

  • KO_DOCKER_REPO - Set this to an image registry your tests can push images to

Running

End to end tests live in this directory. To run these tests, you must provide go with -tags=e2e. By default the tests run against your current kubeconfig context, but you can change that and other settings with the flags. Run e2e tests with:

go test -v -count=1 -tags=e2e -timeout=20m ./test
go test -v -count=1 -tags=e2e -timeout=20m ./test --kubeconfig ~/special/kubeconfig --cluster myspecialcluster

You can also use all flags defined in knative/pkg/test.

Flags

  • By default the e2e tests run against the current cluster in ~/.kube/config using the environment specified in your environment variables.
  • Since these tests are fairly slow, running them with logging enabled is recommended (-v).
  • Using --logverbose will show the verbose log output from test as well as from k8s libraries.
  • Using -count=1 is the idiomatic way to disable test caching.
  • The e2e tests take a long time to run, so a value like -timeout=20m can be useful depending on what you're running.

You can use test flags to control the environment your tests run against, i.e. override your environment variables:

go test -v -tags=e2e -count=1 ./test --kubeconfig ~/special/kubeconfig --cluster myspecialcluster

Tests importing github.com/tektoncd/triggers/test recognize the flags added by knative/pkg/test.

Tests are run in a new random namespace prefixed with the word arakkis-. Unless you set the TEST_KEEP_NAMESPACES environment variable the namespace will get automatically cleaned up after running each test.

Running specific test cases

To run all the test cases with their names starting with the same letters, e.g. EventListener, use the -run flag with go test:

go test -v -tags=e2e -count=1 ./test -run ^TestEventListener

Running YAML tests

To run the YAML e2e tests, run the following command:

./test/e2e-tests-yaml.sh

Adding integration tests

In the test dir you will find several libraries in the test package you can use in your tests.

This library exists partially in this directory and partially in knative/pkg/test.

The libs in this dir can:

All integration tests must be marked with the e2e build constraint so that go test ./... can be used to run only the unit tests, i.e.:

// +build e2e

Cleaning up cluster-scoped resources

Each integration test runs in its own Namespace; each Namespace is torn down after its integration test completes. However, cluster-scoped resources will not be deleted when the Namespace is deleted. So, each test must delete all the cluster-scoped resources that it creates.

Setup tests

The setup function in init_tests.go will initialize client objects, create a new unique Namespace for the test, and initialize anything needed globally by the tests (i.e. logs and metrics).

clients, namespace := setup(t)

The clients struct contains initialized clients for accessing:

See init_test.go and clients.go for more information.

Poll resources

After creating, updating, or deleting kubernetes resources, you will need to wait for the system to realize these changes. You can use polling methods to check the resources reach the desired state.

The WaitFor* functions use the Kubernetes wait package. For polling they use PollImmediate with a ConditionFunc callback function, which returns a bool to indicate if the polling should stop and an error to indicate if there was an error.

See wait.go for more information.

Generate random names

You can use the names package from the Tekton Pipeline project to append a random string, so that your tests can use unique names each time they run.

import "github.com/tektoncd/pipeline/pkg/names"

namespace := names.SimpleNameGenerator.RestrictLengthWithRandomSuffix("arrakis")

Running presubmit integration tests

The presubmit integration tests entrypoint will run:

When run using Prow, integration tests will try to get a new cluster using boskos, which only the tektoncd/plumbing OWNERS have access to.