They pass in staging. They fail in production. They fail when another team tweaks a config you didn’t know existed. The root cause isn’t the app logic. It’s the silent variables—user-specific configs, environment flags, feature toggles—that shift beneath your feet while your CI pipeline smiles and gives you green checks.
Integration testing that ignores user configuration dependence is partial truth at best. A system built on default configs may break instantly for a real user with custom settings. The problem magnifies when your code depends on org-level preferences, per-user roles, third-party credentials, or dynamically loaded feature flags. Standard mock data will not save you here.
User-config-dependent integration testing means running tests against the exact permutation of settings that matter. It ties the test to a stateful truth, not an abstract contract. It forces you to confront full-stack conditions where the request, the middleware, the database, and the configuration all meet. Green builds mean nothing if they don’t reflect that truth.
The key lies in environment fidelity. If you treat configs as just another input, they will betray you. They must be part of the test data, provisioned and controlled just like everything else. Creating a library of canonical configurations—mirroring real-world variants—lets you run meaningful test suites across multiple config states. Run them locally. Run them in CI. Run them with and without that one flag that always breaks production.
When ignored, user config dependence makes tests brittle in ways you can’t predict. When solved, you get coverage that matches reality and confidence that survives real deployments. You see incidents drop because your tests no longer pretend the world has only one valid state.
Deploying these practices requires tooling that lets you spin up matching configurations quickly and isolate them per run. Without it, all the theory collapses into unrepeatable setup scripts and half-broken pipelines.
This is where speed matters. You can make user-config-dependent integration tests live in minutes, not days. See it working end-to-end with real configs on hoop.dev—provision environments fast, keep configs in sync, and stop shipping code blind.