Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Test-Driven Development (TDD) for Infrastructure

Rosemary Wang
November 07, 2019

Test-Driven Development (TDD) for Infrastructure

Originally presented at 2019 O'Reilly Velocity (Berlin).

In software development, test-driven development (TDD) is the process of writing tests and then developing functionality to pass the tests. Let's explore methods of adapting and applying TDD to configuring and deploying infrastructure-as-code.

Repository here: https://github.com/joatmon08/tdd-infrastructure

Rosemary Wang

November 07, 2019
Tweet

More Decks by Rosemary Wang

Other Decks in Technology

Transcript

  1. What’s Test- Driven Development (TDD)? ▪ Write tests firsts, then

    the feature. ▪ “Red, green, refactor” ▪ Benefits: – Only build defined features – Modular, testable code
  2. Why is it a signpost? ▪ #YOLO-driven development ▪ Lack

    of education ▪ Lack of automation / interface ▪ Lack of tooling
  3. Let’s try TDD for Infrastructure. ▪ Infrastructure configuration still requires

    good code practices ▪ Infrastructure architecture has definition of “feature complete” ▪ terraform yolo isn’t a thing (or insert deploy command here).
  4. Integration Tests Contract Tests Unit Tests TDD Up the Pyramid

    Manual Testing Cost (Time, $$$) End-to-End Tests
  5. Unit Tests ▪ Test individual component ▪ Can be run

    without dependencies ▪ Infrastructure: check specific configuration & syntax
  6. Live Code ▪ We’ll use conftest (Open Policy Agent) &

    terraform validate. ▪ Terraform-specific tools, compiled by Peter Souter: – clarity – terraform-compliance – terraform_validate ▪ Other infrastructure: native testing frameworks
  7. Contract Tests ▪ Validate interactions between 2 components (input &

    output) ▪ “Real” resources not required ▪ Compare infrastructure state
  8. Live Code ▪ We’ll use conftest (Open Policy Agent) &

    terraform plan. ▪ Terraform-specific tools: kitchen-terraform ▪ Can also use native testing frameworks – Example for network switches with Python – Example for S3 Bucket Policy with Golang – If Kubernetes, check Kubernetes to external components (i.e., DNS)
  9. Integration Tests ▪ Confirms interactions between 2+ components ▪ Real

    resources required ▪ May also include acceptance tests
  10. IMPORTANT ▪ Integration tests are about interactions. ▪ When using

    IaC tool, testing deployment is redundant. – In Terraform, covered by Provider Acceptance Tests ▪ Many types of integration tests, including Functional, Policy, & Security
  11. Tools ▪ Terraform-specific tools: terratest, kitchen-terraform, Sentinel ▪ Other tools:

    – AWS localstack / mocking framework (USE WITH CAUTION) – Kubernetes local environments (KIND, Minikube, etc.) – Various Inspec resource packs
  12. Fails! TERMINAL > kitchen test -----> Starting Kitchen (v2.3.3) …

    Waiting for SSH service on 54.93.35.169:22, retrying in 3 seconds Waiting for SSH service on 54.93.35.169:22, retrying in 3 seconds Waiting for SSH service on 54.93.35.169:22, retrying in 3 seconds Waiting for SSH service on 54.93.35.169:22, retrying in 3 seconds Waiting for SSH service on 54.93.35.169:22, retrying in 3 seconds
  13. Pass! TERMINAL > kitchen test -----> Starting Kitchen (v2.3.3) …

    Profile: Integration Tests for Application (default) ✔ db: Database: check routing from public to private subnet ✔ Host 10.128.0.43 port 27017 proto tcp should be reachable ✔ Host 10.128.0.43 port 27017 proto tcp should be resolvable ✔ Host 10.128.0.43 port 80 proto tcp should not be reachable ✔ outbound: Public Subnet: check routing out to public internet ✔ HTTP GET on https://hashicorp.com status should cmp == 301 Profile Summary: 2 successful controls, 0 control failures, 0 controls skipped Test Summary: 3 successful, 0 failures, 0 skipped
  14. Integration TDD Not that fast Requires real resources Convert theory

    to reality Caught a missing component Isolate sections of system
  15. End-to-End Tests ▪ “The Real Deal” ▪ Can be manual,

    fully automated, or smoke tests ▪ If it starts smoking, it doesn’t work.
  16. Tools ▪ Terraform-specific tools: terratest, Sentinel ▪ Other: – Behavior-Driven

    Development (BDD) Frameworks – Can also use native testing frameworks – Kubernetes: Sonobuoy conformance tests, local environments (KIND, Minikube, etc.)
  17. Ugh, so much effort. ▪ (Yes, it can be.) ▪

    Unit testing is useless here! ▪ I don’t find testing tools for this! ▪ Stop with pedantic practices!
  18. Use TDD to Learn Infrastructure ▪ Confidence in infrastructure-as-code ▪

    Develop knowledge of infrastructure ▪ More useful integration & end-to-end tests ▪ Tacit knowledge of a change’s blast radius