Smoke Testing After Deployment: Verify Every Release Instantly
Smoke testing after deployment is the first line of defense against a broken release reaching users. Where regression suites take hours, a smoke test suite runs in minutes and tells you the single most important thing: is the system alive and functional?
This guide covers how to build a post-deployment smoke testing workflow that runs automatically, fails fast, and pages the right people when something goes wrong.
What Smoke Testing After Deployment Actually Means
A smoke test is not a full regression. It verifies that the critical paths work — the features users will hit in the first 30 seconds of their session. If those pass, you have enough confidence to let traffic in. If they fail, you roll back.
Post-deployment smoke tests differ from pre-deployment tests in one key way: they run against the real environment with real dependencies. A test that passes in staging may fail in production because:
- A feature flag is off in production but on in staging
- The production database has different seed data
- An external API integration uses production credentials vs. staging keys
- DNS or SSL certificates differ between environments
Running smoke tests against the actual deployed environment catches these gaps.
What to Include in a Smoke Test Suite
Select tests that cover the application's critical paths. For most web applications, this means:
Authentication
- User can log in with valid credentials
- Session persists across page loads
- Logout invalidates the session
Core Feature (the thing users pay for)
- Primary workflow completes end-to-end
- Data created by the workflow is retrievable
Health Endpoints
/healthor/statusreturns 200- Database connectivity confirmed
- External API integrations responding
Navigation
- Homepage loads without errors
- Key navigation routes return correct HTTP status
Keep the suite to 10–20 tests. Anything more and you're building a regression suite, not a smoke suite. Smoke tests must finish in under 5 minutes.
Running Smoke Tests With Robot Framework
Robot Framework with Playwright is a straightforward way to build smoke tests that run headlessly in CI. Here's a minimal smoke test structure:
*** Settings ***
Library Browser
Suite Setup New Browser headless=True
Suite Teardown Close Browser
*** Variables ***
${BASE_URL} ${ENV_BASE_URL}
*** Test Cases ***
Health Check Passes
${response}= HTTP GET ${BASE_URL}/health
Should Be Equal As Integers ${response.status} 200
User Can Log In
New Page ${BASE_URL}/login
Fill Text [name="email"] smoke@example.com
Fill Text [name="password"] ${SMOKE_PASSWORD}
Click button[type="submit"]
Wait For URL **/*dashboard*
Get Text h1 == Dashboard
Core Workflow Executes
Click [data-testid="create-item"]
Fill Text [name="title"] Smoke Test Item
Click button[type="submit"]
Get Text .success-message == Item created
Session Persists After Reload
Reload
Get URL == ${BASE_URL}/dashboardPass ENV_BASE_URL as an environment variable at runtime so the same tests run against staging, canary, and production without modification.
Integrating With GitHub Actions
Run smoke tests automatically after every deployment:
name: Post-Deploy Smoke Tests
on:
workflow_run:
workflows: ["Deploy to Production"]
types: [completed]
jobs:
smoke-tests:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Robot Framework
run: pip install robotframework robotframework-browser
- name: Run Smoke Suite
env:
ENV_BASE_URL: ${{ vars.PRODUCTION_URL }}
SMOKE_PASSWORD: ${{ secrets.SMOKE_USER_PASSWORD }}
run: robot --outputdir results smoke/
- name: Upload results on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: smoke-test-results
path: results/If smoke tests fail, the workflow fails and your deployment pipeline can trigger an automatic rollback.
Triggering Rollback on Smoke Failure
Connect the smoke test result to your deployment system:
- name: Rollback on smoke failure
if: failure()
run: |
echo "Smoke tests failed — triggering rollback"
curl -X POST "${{ vars.DEPLOY_WEBHOOK }}/rollback" \
-H "Authorization: Bearer ${{ secrets.DEPLOY_TOKEN }}" \
-d '{"environment": "production", "reason": "smoke-test-failure"}'For Kubernetes deployments, rollback is built in:
kubectl rollout undo deployment/my-app -n productionAdd this as a step after smoke test failure in your CI workflow.
HelpMeTest for Continuous Post-Deployment Smoke Testing
Running smoke tests once after deploy is good. Running them continuously after deploy catches issues that appear under real traffic — a cache warming problem, a slow database query that only surfaces after N requests, a third-party webhook that starts failing after the deployment.
HelpMeTest runs your test suite on a schedule — every 5 minutes standard, every 10 seconds on Enterprise. You write tests once in plain English, and HelpMeTest runs them continuously against your production environment. When they fail, you get alerted immediately.
This turns smoke tests from a one-time post-deploy gate into a continuous production monitoring system.
Dedicated Smoke Test User
Don't use a real user account for smoke testing. Create a dedicated smoke test user that:
- Has all permissions needed to exercise smoke scenarios
- Uses a known, stable password stored in CI secrets
- Is excluded from analytics so smoke test activity doesn't pollute metrics
- Has rate limiting bypassed if applicable (or is on a plan that doesn't hit limits)
Mark the account clearly: smoke-test@yourcompany.com or similar. Alert if this account appears in customer-facing analytics.
Managing Test Data
Smoke tests that create data need a cleanup strategy. Options:
Use a separate environment namespace: Create items in a smoke-test category or tenant that's excluded from real data exports.
Delete after each run: Add a teardown step that deletes everything created during the smoke run.
Use idempotent operations: Design smoke tests around read-only operations or operations that produce the same result when repeated (upsert semantics).
The simplest approach: create a smoke-test tag on all items created by tests, and run a cleanup script after each test suite.
When Smoke Tests Are Not Enough
Smoke tests catch "is it broken" — they don't catch "is it slow." A deployment that passes smoke tests but serves 4-second page loads is still a bad deployment.
Combine smoke tests with:
- Performance thresholds: Add timing assertions to smoke tests. If
New Pagetakes more than 2 seconds, fail the test. - Synthetic monitoring: Run a subset of smoke tests every few minutes after deploy to watch for degradation over time.
- Error rate monitoring: Watch your error tracking tool for a spike in the 10 minutes after deployment.
The combination of fast smoke testing (binary pass/fail) and continuous monitoring (trend detection) covers both immediate failures and gradual degradation.
Summary
Post-deployment smoke testing is straightforward: define 10–20 critical path tests, run them against the real environment after every deploy, fail the pipeline if they fail, and alert if they stay failed. Keep the suite fast (under 5 minutes), use a dedicated test user, and clean up test data systematically.
The teams that do this well treat the smoke suite as a living document — adding a test whenever a post-deploy issue is found in production, so the same failure can't happen twice.