Run tests #
Before you begin #
Generate the modified provider(s)
Set up application default credentials for Terraform
gcloud auth application-default login export GOOGLE_USE_DEFAULT_CREDENTIALS=true
Set the following environment variables:
export GOOGLE_PROJECT=PROJECT_ID export GOOGLE_REGION=us-central1 export GOOGLE_ZONE=us-central1-a
Replace
PROJECT_ID
with the ID of the Google Cloud project you are using for testing.Optional: Some tests may require additional variables to be set, such as:
GOOGLE_ORG GOOGLE_BILLING_ACCOUNT
Run automated tests #
Run unit tests and linters
cd $GOPATH/src/github.com/hashicorp/terraform-provider-google make test make lint
Run acceptance tests for only modified resources. (Full test runs can take over 9 hours.) See Go’s documentation for more information about
-run
and other flags.make testacc TEST=./google/services/container TESTARGS='-run=TestAccContainerNodePool'
Note: Acceptance tests create actual infrastructure which can incur costs. Acceptance tests may not clean up after themselves if interrupted, so you may want to check for stray resources and / or billing charges.
Optional: Save verbose test output (including API requests and responses) to a file for analysis.
TF_LOG=DEBUG make testacc TEST=./google/services/container TESTARGS='-run=TestAccContainerNodePool_basic' > output.log
Optional: Debug tests with Delve. See
dlv test
documentation for information about available flags.cd google TF_ACC=1 dlv test -- --test.v --test.run TestAccComputeRegionBackendService_withCdnPolicy
Run unit tests and linters
cd $GOPATH/src/github.com/hashicorp/terraform-provider-google-beta make test make lint
Run acceptance tests for only modified resources. (Full test runs can take over 9 hours.) See Go’s documentation for more information about
-run
and other flags.make testacc TEST=./google-beta/services/container TESTARGS='-run=TestAccContainerNodePool'
Note: Acceptance tests create actual infrastructure which can incur costs. Acceptance tests may not clean up after themselves if interrupted, so you may want to check for stray resources and / or billing charges.
Optional: Save verbose test output to a file for analysis.
TF_LOG=DEBUG make testacc TEST=./google-beta/services/container TESTARGS='-run=TestAccContainerNodePool_basic' > output.log
Optional: Debug tests with Delve. See
dlv test
documentation for information about available flags.cd google-beta TF_ACC=1 dlv test -- --test.v --test.run TestAccComputeRegionBackendService_withCdnPolicy
Common errors #
After applying this test step, the plan was not empty.
- See Fix diffs.
Blocks of type "FIELD_NAME" are not expected here
- The field does not exist; this is either because it has not been implemented or because the test is running for the
google
provider and the field is only implemented in thegoogle-beta
provider. See Add resource tests for information on using version guards to exclude beta-only fields from GA tests, or Promote from beta to GA for information on how to promote fields that were accidentally made beta-only.
- The field does not exist; this is either because it has not been implemented or because the test is running for the
Optional: Test with different terraform
versions
#
Tests will use whatever version of the terraform
binary is found on your PATH
. If you are testing a change that you know only impacts certain terraform
versions, follow these steps:
Install
tfenv
.Install the version of
terraform
you want to test.tfenv install VERSION
Replace
VERSION
with the version you want to test.Run automated tests following the earlier section.
Optional: Test manually #
For manual testing, you can build the provider from source and run terraform apply
to verify the behavior.
Before you begin #
Configure Terraform to use locally-built binaries for google
and google-beta
instead of downloading the latest versions.
Find the location where built provider binaries are created. To do this, run this command and make a note of the path value:
go env GOBIN ## If the above returns nothing, then run the command below and add "/bin" to the end of the output path. go env GOPATH
Create an empty configuration file.
## create an empty file touch ~/tf-dev-override.tfrc ## open the file with a text editor of your choice, e.g: vi ~/tf-dev-override.tfrc
Open the empty file with a text editor and paste in these contents:
provider_installation { # Developer overrides will stop Terraform from downloading the listed # providers their origin provider registries. dev_overrides { "hashicorp/google" = "GO_BIN_PATH/bin" "hashicorp/google-beta" = "GO_BIN_PATH/bin" } # For all other providers, install them directly from their origin provider # registries as normal. If you omit this, Terraform will _only_ use # the dev_overrides block, and so no other providers will be available. direct {} }
Edit the file to replace
GO_BIN_PATH
with the path you saved from the first step, making sure to keep/bin
at the end of the path.Please note: the full path is required and environment variables cannot be used. For example,
"/Users/UserName/go/bin"
is a valid path for a user calledUserName
, but"~/go/bin"
or"$HOME/go/bin"
will not work.Save the file.
Find the location where built provider binaries are created. To do this, run this command and make a note of the path value:
echo %GOPATH%
Create an empty configuration file in the
%APPDATA%
directory (use$env:APPDATA
in PowerShell to find its location on your system).## create an empty file type nul > "$($env:APPDATA)\tf-dev-override.tfrc" ## open the file with a text editor of your choice, e.g: notepad "$($env:APPDATA)\tf-dev-override.tfrc"
Open the empty file with a text editor and paste in these contents:
provider_installation { # Developer overrides will stop Terraform from downloading the listed # providers their origin provider registries. dev_overrides { "hashicorp/google" = "GO_BIN_PATH\bin" "hashicorp/google-beta" = "GO_BIN_PATH\bin" } # For all other providers, install them directly from their origin provider # registries as normal. If you omit this, Terraform will _only_ use # the dev_overrides block, and so no other providers will be available. direct {} }
Edit the file to replace
GO_BIN_PATH
with the output you saved from the first step, making sure to keep\bin
at the end of the path.Please note: The full path is required and environment variables cannot be used. For example,
C:\Users\UserName\go\bin
is a valid path for a user calledUserName
.Save the file.
Run manual tests #
Build the provider(s) you want to test
## google provider cd $GOPATH/src/github.com/hashicorp/terraform-provider-google make build ## google-beta provider cd $GOPATH/src/github.com/hashicorp/terraform-provider-google-beta make build
Create a new directory and a
main.tf
file with your resource and its dependencies.In the new directory, run
terraform plan
as follows:TF_CLI_CONFIG_FILE="$HOME/tf-dev-override.tfrc" terraform plan
Replace the TF_CLI_CONFIG_FILE value with the full path to your developer overrides file.
Optional: Verify that developer overrides are working by looking for output like the following near the start of the output:
│ Warning: Provider development overrides are in effect │ │ The following provider development overrides are set in the CLI configuration: │ - hashicorp/google in /Users/UserName/go/bin │ - hashicorp/google-beta in /Users/UserName/go/bin │ │ The behavior may therefore not match any released version of the provider and applying │ changes may cause the state to become incompatible with published releases.
Run
terraform apply
with developer overrides.TF_CLI_CONFIG_FILE="$HOME/tf-dev-override.tfrc" terraform apply
Optional: Save verbose
terraform apply
output (including API requests and responses) to a file for analysis.TF_LOG=DEBUG TF_LOG_PATH=output.log TF_CLI_CONFIG_FILE="$HOME/tf-dev-override.tfrc" terraform apply
Cleanup #
To stop using developer overrides, stop setting TF_CLI_CONFIG_FILE
in the commands you are executing.
Terraform will resume its normal behaviour of pulling published provider versions from the public Registry. Any version constraints in your Terraform configuration will come back into effect. Also, you may need to run terraform init
to download the required version of the provider into your project directory if you haven’t already.