Smoke Testing After Deployment: Verify Every Release Instantly

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

  • /health or /status returns 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}/dashboard

Pass 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 production

Add 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 Page takes 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.

Read more

Start now free