← Concepts

阅读中文版本

Hermetic Test Environments

Hermetic tests run sealed from the outside world: no network, no shared services, no ambient state — every dependency is started, controlled, and torn down by the test run itself.

testing

Definition

A hermetic test suite depends only on artifacts it brings: embedded databases, containerized dependencies, faked external services, and deterministic clocks. Nothing outside the build influences outcomes, so results reproduce anywhere — developer laptop, CI runner, air-gapped network. It is the strongest answer to environment-dependent flakes.

Context and scope

Implemented with testcontainers, in-memory servers, localstack-style emulators, and DNS or socket-level blocking of unintended egress.

Common misconceptions

  • Hermetic means no databases — it means no unmanaged dependencies; a containerized Postgres started by the test is hermetic
  • Stubs of external APIs make tests hermetic — stubs remove the network, but only egress blocking proves nothing else is silently called
  • Hermetic suites are slower than shared environments — per-run startup costs are real, offset by eliminating cross-team contention and flakes

Anti-patterns

  • Pointing integration tests at a shared staging environment and inheriting every deploy as a test failure
  • Faking one API while the code still calls a real CDN, leaking slow drift into the suite
  • Forgetting the clock and randomness, which stay ambient even when the network is sealed

Related concepts

Related examples

Authoritative source

https://testing.googleblog.com/2012/10/hermetic-servers.html

What it is

A test that talks to the internet is not a test — it is a wish about someone else uptime. Hermeticity replaces wishes with ownership: the run controls everything it touches.

How it works

Dependencies launch per run or per suite: containers from pinned images, in-process fakes on local sockets, emulators for cloud services. Egress firewalls fail any unexpected outbound call loudly. Deterministic seeds and injected clocks remove ambient time. The suite output is a function of the code alone.

When to invest

Flakes that track external availability, CI queues blocked on shared environments, and security-sensitive testing of untrusted payloads where egress must be provably contained. The upfront container and fake investment repays itself the first time an external outage would have reddened every branch.

Pitfalls

Emulator fidelity diverges from the real service — contract tests against the provider complement emulated behavior. Startup cost shapes suite architecture: session-scoped containers with isolated state per test. Full hermeticity for browser-matrix e2e remains expensive; target the integration tier where payoff concentrates.