Test Types

Test Types

KeyValue
StatusActive
OwnerQA Automation
Updated2026-03-26
ScopePurpose, depth, and scheduling of every suite and monitor-adjacent test area

This page answers the question people ask most often: “Which suite should I run, and what does it actually prove?” The short version is that each suite exists for a different decision. Fast suites answer “is the site okay right now?” Deeper suites answer “did we break a real user flow?” Specialized suites answer “did a specific surface drift?”

Suite Comparison
SuiteMain QuestionTypical DepthTypical Timing
SmokeIs the site up and basically usable?Shallow and fastFrequent
ShadowIs quality degrading even if the site is still “up”?Lightweight monitoring journeysFrequent
PDTDid the latest deployment break anything critical?Deploy-focused functional checksAfter deploy
E2EDo real editorial and reader journeys work?Broad user journeysDaily
User-FlowsDo login, premium, session, and subscription flows work?Auth-sensitive pathsNightly
MobileDoes the site behave on real mobile surfaces?Tiered depthPR plus nightly
ContentAre important CMS modules rendering and behaving?Registry-drivenDaily
VisualDid core structural layout change?Baseline-dependent screenshotsWeekly or manual
PerformanceDid key performance metrics drift?Budget and baseline checksScheduled or on demand
AdsAre ad placements and ad behavior still correct?Revenue-critical validationScheduled
EventsAre expected analytics events still firing?Instrumentation validationScheduled
The Practical Pyramid
%%{init: {'theme':'base', 'themeVariables': {'primaryColor': '#4a90d9', 'primaryTextColor': '#fff', 'primaryBorderColor': '#2c6fad', 'lineColor': '#555', 'fontFamily': 'sans-serif'}}}%%
graph BT
    UNIT["Unit Tests\n(existing)"]
    SMOKE["Smoke Tests\n12 tests | every 15 min"]
    SHADOW["Shadow Tests\n6 sites | every 4h"]
    PDT["PDT Tests\n30 tests | after deploy"]
    E2E["E2E Tests\n76 tests | daily"]
    UF["User-Flows Tests\n34 tests | nightly"]
    MOB["Mobile Tests\n23 tests/project | daily"]
    EV["Events Tests\n1-6 sites | daily"]
    CT["Content Tests\n6 sites | daily"]

    UNIT --> SMOKE
    SMOKE --> SHADOW
    SHADOW --> PDT
    PDT --> E2E
    PDT --> UF
    PDT --> MOB
    PDT --> EV
    PDT --> CT
LayerWhat It Is Good For
SmokeFast confidence and outage detection
Shadow and PDTOperational safety and deploy confidence
E2E and User-FlowsReal user-value journeys
Mobile, Content, Visual, Performance, Ads, EventsSpecialized risk areas that can drift independently
Smoke Tests

Smoke is the first line of defense. It should answer “is this site broken in an obvious way?” quickly and cheaply.

FocusExamples
Reachabilityhomepage loads, content renders
Compliance accessconsent can be handled
Basic structureheader, navigation, footer, article surface
Critical runtime healthno obvious server or console breakage

Best used when:

  • you want a fast health check
  • you just pulled main
  • you want a safe first CI or local run

Main command: npm run test:smoke

Shadow Tests

Shadow is closer to production monitoring than classic regression testing. It looks for degradation, flaky navigation, and structural issues that users would feel before a full outage is obvious.

FocusWhy It Matters
navigation and key pathscatches broken menus and dead-end navigation
reliability over speedbetter to be consistent than “fast but noisy”
graceful fallback behaviorespecially important on dynamic news sites

Main command: npm run test:shadow

PDT Tests

PDT means post-deployment tests. This suite is designed for the question “did the deploy break critical behavior?”

PDT Is Best At CatchingTypical Examples
broken deploy outputmissing structure, bad selectors, dead critical nav
high-value product regressionshomepage/article paths, category navigation
cross-site and redirect mistakesespecially on CNC domain families

Main command: npm run test:pdt

E2E Tests

E2E is where the platform starts behaving like a real reader instead of a fast monitor. These tests cover actual browsing journeys: article discovery, galleries, video, social sharing, and site-specific editorial surfaces.

E2E Covers WellNotes
article reading journeysacross all six sites
gallery and media flowswith site-specific fallback logic
video and live surfacesconditional where content is truly ephemeral
social and journey continuitynot just isolated element checks

Main command: npm run test:e2e

User-Flows Tests

User-Flows is the premium and auth suite. It exists because anonymous browsing and logged-in premium behavior break in different ways.

Flow AreaWhy It Has Its Own Suite
loginrate limits, consent, overlay interference
premium article accessentitlement and redirect logic
paywall handlingtiming and state-sensitive
logout and session persistenceeasy to miss in generic E2E coverage

Main command: npm run test:user-flows

Mobile Tests

Mobile is not one flat suite. It is intentionally tiered so teams can choose the right amount of confidence for the moment.

%%{init: {'theme':'base', 'themeVariables': {'primaryColor': '#4a90d9', 'primaryTextColor': '#fff', 'primaryBorderColor': '#2c6fad', 'lineColor': '#555', 'secondaryColor': '#e8f4e8', 'tertiaryColor': '#fff8e1', 'fontFamily': 'sans-serif'}}}%%
flowchart TB
  subgraph smoke_tier["@smoke — PR Gate (9 tests)"]
    direction LR
    S1["Viewport meta"] --- S2["No overflow"] --- S3["Breakpoints"]
    S4["Images"] --- S5["Touch targets"] --- S6["Hamburger"]
    S7["Tap navigation"] --- S8["Scroll"] --- S9["Consent"]
  end
  subgraph regression_tier["@regression — Nightly (8 tests)"]
    direction LR
    R1["Sticky header"] --- R2["Form inputs"] --- R3["Video presence"]
    R4["Media playback"] --- R5["Lazy images"] --- R6["Live surface"]
    R7["Orientation"]
  end
  subgraph deep_tier["@deep — Nightly (6 tests)"]
    direction LR
    D1["Load budget"] --- D2["LCP budget"] --- D3["CLS budget"]
    D4["DOM budget"] --- D5["Subscription"] --- D6["Full journey"]
  end
  smoke_tier --> regression_tier --> deep_tier
TierPurposeTypical Use
@smokePR-safe mobile basicsPull requests, quick validation
@regressionbroader behavior and media checksNightly regression
@deepjourney plus performance budget checksNightly deeper confidence

Important characteristics:

  • Chrome and Safari variants exist
  • matrix jobs can run all sites
  • per-site mobile seed URLs reduce content-rotation flake
  • mobile is treated as a product surface, not just a viewport resize

Main commands:

GoalCommand
quick mobile passnpm run test:mobile:smoke
nightly regression tiernpm run test:mobile:regression
deep mobile checksnpm run test:mobile:deep
Safari checknpm run test:mobile:safari:smoke
all-site matrixnpm run test:mobile:matrix:smoke
Content Tests

Content Tests are one of the biggest changes in the platform. They moved the system from “does the page load?” to “are the editorial modules we care about still rendering and behaving?”

%%{init: {'theme':'base', 'themeVariables': {'primaryColor': '#4a90d9', 'primaryTextColor': '#fff', 'primaryBorderColor': '#2c6fad', 'lineColor': '#555', 'fontFamily': 'sans-serif'}}}%%
flowchart LR
    REG[“Content Registry\n120 entries\n231 site slots”] --> ORCH[“Orchestrator\ngroup by context\nnavigate once”]
    ORCH --> HP[“Homepage\nContext”]
    ORCH --> ART[“Article\nContext”]
    ORCH --> SEED[“SeedURL\nContext”]
    HP --> HAND[“12 Handlers\narticle, gallery, video,\nnav, search, embed, ...”]
    ART --> HAND
    SEED --> HAND
    HAND --> RES[“Results\n+ JSONL Logs\n+ History”]
Content Suite CharacteristicWhat It Means
registry-drivenall content types live in a shared registry
handler-basedspecialized logic per module family
tiered depthexistence, interaction, and journey coverage
context-awareentries are grouped by page context to avoid wasteful navigation
history-awareregressions can be detected over time, not just per run

Main commands:

GoalCommand
all-site existence runnpm run test:content
existence tiernpm run test:content:existence
interaction tiernpm run test:content:interaction
journey tiernpm run test:content:journey
coverage mappingnpm run coverage:map
Visual Tests

Visual is often misunderstood. The current suite is not a full design review suite. It is a structural screenshot suite that tries to catch layout drift without being overwhelmed by constantly changing headlines, images, ads, and live content.

What The Visual Suite DoesWhat It Does Not Try To Do
compare homepage above-fold structureverify every pixel of live editorial content
compare header structureact as a full brand/design approval process
compare footer structurereplace human review for major redesigns

Important notes:

  • the suite is baseline-dependent
  • Linux baselines are what matter in CI
  • missing baselines are a configuration problem, not a visual regression
  • the suite currently uses 18 checks: 3 structural surfaces across 6 sites

Main command: npm run test:visual

Performance Tests

Performance tests answer a different question from functional suites: “Did the site still load well enough?”

Performance FocusExamples
CWV and timing budgetsload time, LCP, CLS, related metrics
baseline comparisoncompare against stored performance baselines
site-specific thresholdsbecause not all CNC sites behave the same

Main commands:

GoalCommand
standard runnpm run test:performance
create or refresh baselinenpm run test:performance:baseline
breaking-news style checksnpm run test:performance:breaking
Ads Tests

Ads tests exist because revenue regressions are their own category of production issue.

Ads Suite ChecksWhy It Matters
slot presencerevenue surfaces still render
layout expectationsads are where they should be
mobile and desktop variantsplacement differs by device

Main commands:

GoalCommand
full ads suitenpm run test:ads
desktop onlynpm run test:ads:desktop
mobile onlynpm run test:ads:mobile
Events Tests

Events tests check instrumentation rather than visible UI. They answer “are the expected analytics events still firing from real flows?”

Events Suite FocusWhy It Matters
event emissionanalytics still capture key actions
site-specific seed pathsinstrumentation often differs by site
integration confidenceUI can look fine while analytics silently breaks

Main commands:

GoalCommand
standard events runnpm run test:events
all-sites event runnpm run test:events:all-sites
Which Suite Should You Pick?
SituationBest First Choice
quick confidence after pulling mainSmoke
checking whether a deploy broke productionPDT
validating a user journey end to endE2E
working on login or premium behaviorUser-Flows
touching responsive UXMobile
changing CMS modules or editorial renderingContent
checking layout driftVisual
investigating speed regressionsPerformance
touching ad placementsAds
validating analyticsEvents
If You Changed...Run...
general UI and selectorsSmoke, PDT
critical reader journeysSmoke, PDT, E2E
mobile layoutsMobile @smoke, then @regression
premium or login codeUser-Flows, PDT
content modules or registry entriesContent plus one relevant E2E or smoke run
navigation, header, footer structureSmoke, PDT, Visual
One Rule Of Thumb

If you are not sure where to start, do not jump straight to the deepest suite. Start with the cheapest suite that can still falsify your assumption. That keeps feedback fast and makes failures easier to interpret.