Testing patterns for NIC including Go table-driven tests, snapshot tests, and Python integration tests. Use when writing unit tests, snapshot tests, policy tests, template tests, Helm tests, or pytest integration tests for the Ingress Controller.
68
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
| Command | Purpose |
|---|---|
make test | Run all Go tests (-tags=aws,helmunit -shuffle=on ./...) |
make test-update-snaps | Regenerate snapshot golden files (UPDATE_SNAPS=always) |
make lint | golangci-lint via Docker, diff against origin/main |
make format | goimports + gofumpt |
make cover | Generate test coverage report |
make lint-python | Python test formatting: isort + black |
Always use make test over raw go test. Run make test-update-snaps when template output changes.
Note: Helm tests use the //go:build helmunit build tag -- they are only compiled and run when -tags=helmunit is passed (included in make test).
func TestValidateMyPolicy(t *testing.T) {
t.Parallel()
tests := []struct {
policy *v1.Policy
isPlus bool
msg string
}{
{ /* valid case */ },
{ /* edge case */ },
}
for _, test := range tests {
err := ValidatePolicy(test.policy, test.isPlus, false, false)
if err != nil {
t.Errorf("ValidatePolicy returned error %v for case: %s", err, test.msg)
}
}
}Two conventions are in use -- both are acceptable:
Policy/transport tests (policy_test.go, transportserver_test.go):
TestValidate<Thing>_PassesOnValidInputTestValidate<Thing>_FailsOnInvalidInputVirtualServer/general tests (virtualserver_test.go and most other files):
TestValidate<Thing> (valid input, often with subtests)TestValidate<Thing>Fails (invalid input)TestGenerate<Feature>Every test file that uses snaps.MatchSnapshot must have a TestMain that cleans up stale snapshots:
func TestMain(m *testing.M) {
snaps.Clean(m, snaps.CleanOpts{Sort: true})
}Example snapshot test:
func TestVirtualServerForNginx(t *testing.T) {
t.Parallel()
executor := newTmplExecutorNGINX(t)
data, err := executor.ExecuteVirtualServerTemplate(&virtualServerCfg)
require.NoError(t, err)
snaps.MatchSnapshot(t, string(data))
}t.Parallel() at the startt.Helper() in helper functionsgithub.com/google/go-cmp/cmp for deep struct comparisongithub.com/gkampitakis/go-snaps/snaps for snapshot testsLocation: charts/tests/
helmunit_test.go -- Helm snapshot tests using terratest + go-snapstestdata/ -- values.yaml overrides per test scenarioAdd a test values file in charts/tests/testdata/<feature>.yaml and a corresponding test case in helmunit_test.go.
Location: tests/suite/
@pytest.mark.policies
@pytest.mark.policies_myfeature
@pytest.mark.parametrize(
"crd_ingress_controller, virtual_server_setup",
[({"type": "complete", "extra_args": [...]},
{"example": "virtual-server", "app_type": "simple"})],
indirect=True,
)
class TestMyFeaturePolicies:
def test_basic_functionality(self, kube_apis, crd_ingress_controller,
virtual_server_setup, test_namespace):
# 1. Create policy from YAML
pol_name = create_policy_from_yaml(
kube_apis.custom_objects, yaml_src, test_namespace
)
wait_before_test()
# 2. Patch VS to reference policy
patch_virtual_server_from_yaml(...)
# 3. Assert HTTP responses
resp = requests.get(url, headers={"host": vs_host})
assert resp.status_code == 200
assert "Expected-Header" in resp.headers
# 4. Cleanup
delete_policy(kube_apis.custom_objects, pol_name, test_namespace)
patch_virtual_server_from_yaml(...) # restore originalkube_apis, crd_ingress_controller, virtual_server_setup, test_namespacetests/suite/fixtures/ (setup/teardown lifecycle)tests/suite/utils/ (create_policy_from_yaml, patch_virtual_server_from_yaml, delete_policy, wait_before_test)test_<feature>_policies_vs.py -- VirtualServer policy teststest_<feature>_policies_vsr.py -- VirtualServerRoute policy teststest_<feature>_policies_ingress.py -- Ingress policy testsStore YAML manifests in tests/data/<feature>/.
make test-update-snaps after changing any .tmpl file -- snapshot tests will fail otherwisego test -- use make test which includes required build tags__snapshots__/ directories -- commit the regenerated filesTestMain with snaps.Clean(m, snaps.CleanOpts{Sort: true}) -- omitting it causes stale snapshots to accumulateindirect=True parametrize for IC + VS setup -- do not remove this0eb3072
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.