Test Types
| Key | Value |
|---|---|
| Status | Active |
| Owner | QA Automation |
| Updated | 2026-03-26 |
| Scope | Purpose, 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 | Main Question | Typical Depth | Typical Timing |
|---|---|---|---|
| Smoke | Is the site up and basically usable? | Shallow and fast | Frequent |
| Shadow | Is quality degrading even if the site is still “up”? | Lightweight monitoring journeys | Frequent |
| PDT | Did the latest deployment break anything critical? | Deploy-focused functional checks | After deploy |
| E2E | Do real editorial and reader journeys work? | Broad user journeys | Daily |
| User-Flows | Do login, premium, session, and subscription flows work? | Auth-sensitive paths | Nightly |
| Mobile | Does the site behave on real mobile surfaces? | Tiered depth | PR plus nightly |
| Content | Are important CMS modules rendering and behaving? | Registry-driven | Daily |
| Visual | Did core structural layout change? | Baseline-dependent screenshots | Weekly or manual |
| Performance | Did key performance metrics drift? | Budget and baseline checks | Scheduled or on demand |
| Ads | Are ad placements and ad behavior still correct? | Revenue-critical validation | Scheduled |
| Events | Are expected analytics events still firing? | Instrumentation validation | Scheduled |
%%{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| Layer | What It Is Good For |
|---|---|
| Smoke | Fast confidence and outage detection |
| Shadow and PDT | Operational safety and deploy confidence |
| E2E and User-Flows | Real user-value journeys |
| Mobile, Content, Visual, Performance, Ads, Events | Specialized risk areas that can drift independently |
Smoke is the first line of defense. It should answer “is this site broken in an obvious way?” quickly and cheaply.
| Focus | Examples |
|---|---|
| Reachability | homepage loads, content renders |
| Compliance access | consent can be handled |
| Basic structure | header, navigation, footer, article surface |
| Critical runtime health | no 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 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.
| Focus | Why It Matters |
|---|---|
| navigation and key paths | catches broken menus and dead-end navigation |
| reliability over speed | better to be consistent than “fast but noisy” |
| graceful fallback behavior | especially important on dynamic news sites |
Main command: npm run test:shadow
PDT means post-deployment tests. This suite is designed for the question “did the deploy break critical behavior?”
| PDT Is Best At Catching | Typical Examples |
|---|---|
| broken deploy output | missing structure, bad selectors, dead critical nav |
| high-value product regressions | homepage/article paths, category navigation |
| cross-site and redirect mistakes | especially on CNC domain families |
Main command: npm run test:pdt
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 Well | Notes |
|---|---|
| article reading journeys | across all six sites |
| gallery and media flows | with site-specific fallback logic |
| video and live surfaces | conditional where content is truly ephemeral |
| social and journey continuity | not just isolated element checks |
Main command: npm run test:e2e
User-Flows is the premium and auth suite. It exists because anonymous browsing and logged-in premium behavior break in different ways.
| Flow Area | Why It Has Its Own Suite |
|---|---|
| login | rate limits, consent, overlay interference |
| premium article access | entitlement and redirect logic |
| paywall handling | timing and state-sensitive |
| logout and session persistence | easy to miss in generic E2E coverage |
Main command: npm run test:user-flows
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| Tier | Purpose | Typical Use |
|---|---|---|
@smoke | PR-safe mobile basics | Pull requests, quick validation |
@regression | broader behavior and media checks | Nightly regression |
@deep | journey plus performance budget checks | Nightly 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:
| Goal | Command |
|---|---|
| quick mobile pass | npm run test:mobile:smoke |
| nightly regression tier | npm run test:mobile:regression |
| deep mobile checks | npm run test:mobile:deep |
| Safari check | npm run test:mobile:safari:smoke |
| all-site matrix | npm run test:mobile:matrix:smoke |
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 Characteristic | What It Means |
|---|---|
| registry-driven | all content types live in a shared registry |
| handler-based | specialized logic per module family |
| tiered depth | existence, interaction, and journey coverage |
| context-aware | entries are grouped by page context to avoid wasteful navigation |
| history-aware | regressions can be detected over time, not just per run |
Main commands:
| Goal | Command |
|---|---|
| all-site existence run | npm run test:content |
| existence tier | npm run test:content:existence |
| interaction tier | npm run test:content:interaction |
| journey tier | npm run test:content:journey |
| coverage mapping | npm run coverage:map |
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 Does | What It Does Not Try To Do |
|---|---|
| compare homepage above-fold structure | verify every pixel of live editorial content |
| compare header structure | act as a full brand/design approval process |
| compare footer structure | replace 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 answer a different question from functional suites: “Did the site still load well enough?”
| Performance Focus | Examples |
|---|---|
| CWV and timing budgets | load time, LCP, CLS, related metrics |
| baseline comparison | compare against stored performance baselines |
| site-specific thresholds | because not all CNC sites behave the same |
Main commands:
| Goal | Command |
|---|---|
| standard run | npm run test:performance |
| create or refresh baseline | npm run test:performance:baseline |
| breaking-news style checks | npm run test:performance:breaking |
Ads tests exist because revenue regressions are their own category of production issue.
| Ads Suite Checks | Why It Matters |
|---|---|
| slot presence | revenue surfaces still render |
| layout expectations | ads are where they should be |
| mobile and desktop variants | placement differs by device |
Main commands:
| Goal | Command |
|---|---|
| full ads suite | npm run test:ads |
| desktop only | npm run test:ads:desktop |
| mobile only | npm run test:ads:mobile |
Events tests check instrumentation rather than visible UI. They answer “are the expected analytics events still firing from real flows?”
| Events Suite Focus | Why It Matters |
|---|---|
| event emission | analytics still capture key actions |
| site-specific seed paths | instrumentation often differs by site |
| integration confidence | UI can look fine while analytics silently breaks |
Main commands:
| Goal | Command |
|---|---|
| standard events run | npm run test:events |
| all-sites event run | npm run test:events:all-sites |
| Situation | Best First Choice |
|---|---|
| quick confidence after pulling main | Smoke |
| checking whether a deploy broke production | PDT |
| validating a user journey end to end | E2E |
| working on login or premium behavior | User-Flows |
| touching responsive UX | Mobile |
| changing CMS modules or editorial rendering | Content |
| checking layout drift | Visual |
| investigating speed regressions | Performance |
| touching ad placements | Ads |
| validating analytics | Events |
| If You Changed... | Run... |
|---|---|
| general UI and selectors | Smoke, PDT |
| critical reader journeys | Smoke, PDT, E2E |
| mobile layouts | Mobile @smoke, then @regression |
| premium or login code | User-Flows, PDT |
| content modules or registry entries | Content plus one relevant E2E or smoke run |
| navigation, header, footer structure | Smoke, PDT, Visual |
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.