A configured environment (staging, QA, preview) where testing takes place.
A test environment is a provisioned copy of the system, separate from production, where code can be exercised without consequences for real users. Dev, staging, and pre-prod are all test environments at different distances from the real thing. The tension that defines the practice is parity: an environment is only useful to the degree it resembles production, and the cheaper and more convenient you make it, the more it quietly drifts from what users actually hit.
Separate environments for testing predate any formal doctrine, but the modern argument for taking parity seriously was sharpened by Adam Wiggins in The Twelve-Factor App (2011), drawn from what Heroku observed across many thousands of deploymentsDeploymentEngineeringA deployment eventView reference →. Factor X, dev/prod parity, names three gaps that open between development and production: a time gap (code takes days or weeks to ship), a personnel gap (developers write, ops deploy), and a tools gap (SQLite locally, PostgreSQL in production).
Wiggins argued against the appeal of lightweight local substitutes. The twelve-factor developer resists running SQLite on a laptop while production runs PostgreSQL, because the substitution hides incompatibilities that surface only after releaseReleaseProduct SpecificationA shipped version of the productView reference →. Keep the backing services the same across environments and the "works in staging, breaks in production" class of failure largely disappears.
The thinking has since moved toward ephemeral environments: a fresh, production-like environment spun up per featureFeatureProduct SpecificationA product capability or featureView reference → branch and torn down on merge. As practitioners describe it, long-lived staging environments suffer configuration drift, accumulating quick fixes that never reach production until staging and production disagree about what "correct" means. Disposable environments fight drift by being too short-lived to drift, and they give each branch a clean sandbox so one team's tests cannot corrupt another's.
A team runs a shared staging server that everyone deploys to. Two engineers push to it the same afternoon; their test runs interleave, one corrupts the other's seed data, and a failure appears that reproduces on nobody's machine. A week later a release passes on staging and fails in production because staging is still on an old Redis version someone bumped locally but never promoted.
The team switches to ephemeral environments. Each pull request provisions its own environment from the same infrastructure definition as production: same database engine and version, same message broker, same config shape. The environment lives for the life of the branch and is destroyed on merge. The cross-contamination stops because no two branches share state, and the version-skew failures stop because every environment is built from one source of truth that production also uses.
test_environment_mirrors_deploymentTest EnvironmentmirrorsDeploymentcross-domain: the test target should match the production target closely enough that a green deploy means something.In the Unified Product Graph, Test EnvironmentQuality AssuranceA testing environment sits in the quality and testing region as the place where verification happens. A product reaches it through test_environmentProductprovisioned inTest Environmenthierarchy, suites land in it through product_provisioned_in_test_environmentTest Suitedeployed inTest Environmenthierarchy, and its fidelity to production is recorded through test_suite_deployed_in_test_environmentTest EnvironmentmirrorsDeploymentcross-domain. Modelling the environment as a node, with an explicit mirrors edge, makes parity inspectable: the graph can show how far each test environment sits from the deployment it is meant to imitate, which is exactly the distance that "works on my machine" hides in.test_environment_mirrors_deployment
Type-specific fields on BaseNode
env_typestringType of environment
env_statusstringCurrent availability status of the environment
configstringConfiguration details (e.g. OS, browser version, database seed)
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
5 phases — initial: planning · template: OPERATIONAL
3 edge types connected to this entity.
product_provisioned_in_test_environmenttest_suite_deployed_in_test_environmenttest_environment_mirrors_deployment