If you are planning to run the full suite of tests or work on policy sets or registry modules, you'll need to set up repositories for them in GitHub.
Your policy set repository will need the following:
- A policy set stored in a subdirectory
policy-sets/foo
- A branch other than
main
namedpolicies
Your registry module repository will need to be a valid module. It will need the following:
- To be named
terraform-<PROVIDER>-<NAME>
- At least one valid SemVer tag in the format
x.y.z
terraform-random-module is a good example repo.
You'll need to have environment variables setup in your environment to run the tests. There are different options to facilitate setting up environment variables, envchain is one option:
-
Install envchain - refer to the envchain README for details
-
Pick a namespace for storing your environment variables, such as:
go-tfe
-
For each environment variable you need to set, run the following command:
envchain --set YOUR_NAMESPACE_HERE ENVIRONMENT_VARIABLE_HERE
OR
Set all of the environment variables at once with the following command:
envchain --set YOUR_NAMESPACE_HERE TFE_ADDRESS TFE_TOKEN GITHUB_TOKEN GITHUB_POLICY_SET_IDENTIFIER
Tests are run against an actual backend so they require a valid backend address and token:
TFE_ADDRESS
- URL of a Terraform Cloud or Terraform Enterprise instance to be used for testing, including scheme. Example:https://tfe.local
TFE_TOKEN
- A user API token for the Terraform Cloud or Terraform Enterprise instance being used for testing.
Note: Alternatively, you can set TFE_HOSTNAME
which serves as a fallback for TFE_ADDRESS
. It will only be used if TFE_ADDRESS
is not set and will resolve the host to an https
scheme. Example: tfe.local
=> resolves to https://tfe.local
GITHUB_TOKEN
- GitHub personal access token. Required for running any tests that use VCS (OAuth clients, policy sets, etc).GITHUB_POLICY_SET_IDENTIFIER
- GitHub policy set repository identifier in the formatusername/repository
. Required for running policy set tests.GITHUB_REGISTRY_MODULE_IDENTIFIER
- GitHub registry module repository identifier in the formatusername/repository
. Required for running registry module tests.ENABLE_TFE
- Some tests are only applicable to Terraform Enterprise or Terraform Cloud. By settingENABLE_TFE=1
you will enable enterprise only tests and disable cloud only tests. In CIENABLE_TFE
is not set so if you are writing enterprise only features you should manually test withENABLE_TFE=1
against a Terraform Enterprise instance.SKIP_PAID
- Some tests depend on paid only features. By settingSKIP_PAID=1
, you will skip tests that access paid features.ENABLE_BETA
- Some tests require access to beta features. By settingENABLE_BETA=1
you will enable tests that require access to beta features. IN CIENABLE_BETA
is not set so if you are writing beta only features you should manually test withENABLE_BETA=1
against a Terraform Enterprise instance with those features enabled.TFC_RUN_TASK_URL
- Run task integration tests require a URL to use when creating run tasks. To learn more about the Run Task API, read here
In order for the tests relating to queuing and capacity to pass, FRQ (fair run queuing) should be enabled with a limit of 2 concurrent runs per organization on the Terraform Cloud or Terraform Enterprise instance you are using for testing.
For most situations, it's recommended to run specific tests because it takes about 20 minutes to run all of the tests.
Typically, you'll want to run specific tests. The commands below use notification configurations as an example.
$ envchain YOUR_NAMESPACE_HERE go test -run TestNotificationConfiguration -v ./... -tags=integration
$ TFE_TOKEN=xyz TFE_ADDRESS=xyz ENABLE_TFE=1 go test -run TestNotificationConfiguration -v ./... -tags=integration
It takes about 20 minutes to run all of the tests, so specify a larger timeout when you run the tests (the default timeout is 10 minutes):
$ envchain YOUR_NAMESPACE_HERE go test ./... -timeout=30m -tags=integration
$ TFE_TOKEN=xyz TFE_ADDRESS=xyz ENABLE_TFE=1 go test ./... -timeout=30m -tags=integration