www/docs/blog/smoke-tests-as-the-last-gatekeeper.md
When Wox moved faster, the risk profile changed with it.
Cross-platform desktop software already has enough moving parts on its own: a Go backend, a Flutter desktop UI, plugin hosts, settings, storage, and platform-specific behavior. Once AI starts helping us generate, refactor, and iterate code faster, delivery speed goes up again. That is good for productivity, but it also means regressions can sneak in through places that still look locally reasonable.
That is why we decided to build an automated smoke test flow for Wox. In the AI era, automated testing is no longer just an efficiency tool. It is the last gatekeeper before regressions reach users.
Unit tests are useful, but they do not fully answer the question we care about most before shipping:
Can Wox actually start, connect, show the launcher, react to input, open settings, and survive the most important user paths without falling apart?
For Wox, many reliability failures happen at the boundaries:
wox.core processThese are exactly the kinds of issues that can slip through code review, especially when iteration gets faster.
We introduced a cross-platform end-to-end smoke test runner under wox.test/.
The current flow is intentionally simple and practical:
wox.core instance in development mode./ping.integration_test cases against that live backend.This gives us a meaningful answer to a high-value question: does the real app still work in a real startup path?
The smoke runner in wox.test/bin/run.dart does a few important things that make it reliable enough to use as a gate:
WOX_TEST_DATA_DIR and WOX_TEST_USER_DIR, so the test never pollutes a developer's normal environment.34987, but automatically falls back to a free local port when needed.http://127.0.0.1:<port>/ping before starting UI tests, instead of assuming startup timing.core.log and flutter_test.log.This matters more than it may seem. A smoke test is only a gatekeeper if it is reproducible, isolated, and diagnosable after failure.
The first batch of smoke cases lives in wox.ui.flutter/wox/integration_test/launcher_smoke_test.dart.
They focus on the core paths that must keep working:
These are not exhaustive tests, and they are not trying to be. The goal of a smoke suite is different: catch critical regressions early with a fast, stable, high-signal flow.
AI makes it much cheaper to produce code. It also makes it cheaper to produce code that looks plausible.
That changes the job of engineering discipline.
The bottleneck is no longer only "can we write the code?" It is increasingly "can we trust the change?" When code generation, refactoring, and experimentation all speed up, the final quality gate has to become more concrete, not less.
For us, smoke tests are that concrete gate:
Put differently, AI can help us move faster, but automated testing decides whether that speed is safe.
The current smoke flow targets the real backend plus the Flutter desktop integration path. That already gives us a useful baseline, but it is only the first layer.
The next natural step is to extend the same idea to packaged builds and broader reliability scenarios, while keeping the suite lightweight enough to stay useful in day-to-day development.
We do not want a test system that looks impressive but nobody trusts.
We want a gatekeeper that fails for the right reasons.