View all services
Talk to QA Advisor
Browse the Knowledge Hub56 resources
/Test Cases/Dashboard and analytics widget test cases

Test cases

Dashboard test cases, for the number that is wrong but plausible

Twenty eight cases covering reconciliation against source records, widgets that disagree with each other, date range and timezone aggregation, zero baselines, no data rendered as zero, permission leaks through aggregates, drill down mismatches, data freshness, partial failures and export fidelity.

28cases/8coverage types/8boundary cases/FreeCSV download

All 28 test cases, ready to copy

Free to use and adapt, no sign-up. Download as CSV or Markdown, or copy it straight into your own tooling.

Last updated

28 worked examples

DSH-01

Reconcile a metric against the underlying records

TypeStatePriorityHigh
Test data
A known data set with a hand calculated expected total
Expected result
Widget figure equals the hand calculated total exactly. This is the only case that proves the metric is right rather than merely stable.
DSH-02

Keep two widgets showing the same measure consistent

TypeStatePriorityHigh
Test data
A summary tile and a chart that both report revenue for the same period
Expected result
Both agree. Two widgets built from different queries drift apart, and the disagreement destroys trust in the whole dashboard.
DSH-03

Match the total to the sum of its breakdown

TypeBoundaryPriorityHigh
Test data
A total tile beside a breakdown by category, including records with no category
Expected result
Breakdown sums to the total, and uncategorised records appear as an explicit group rather than silently disappearing from the breakdown.
DSH-04

Apply the date range filter to every widget

TypeFunctionalPriorityHigh
Test data
Set a custom range and check each widget on the dashboard
Expected result
Every widget honours the range. One widget ignoring the filter while the others obey it is the most common source of an apparently impossible figure.
DSH-05

Handle date range boundaries inclusively and consistently

TypeBoundaryPriorityHigh
Test data
A range whose endpoints exactly match record timestamps, and single day ranges
Expected result
Inclusivity matches the specification, and a record at the boundary is counted in exactly one period across every widget.
DSH-06

Resolve the timezone for aggregation explicitly

TypeBoundaryPriorityHigh
Test data
Records near midnight viewed by users in two timezones, and a range spanning a daylight saving change
Expected result
Aggregation uses a documented timezone consistently, the same day boundary applies to every widget, and the repeated hour does not double count.
DSH-07

Compare against a previous period correctly

TypeBoundaryPriorityHigh
Test data
A month over month comparison across months of different lengths, and one spanning a leap day
Expected result
Comparison period is the documented equivalent, its length is stated, and the percentage change is calculated on comparable spans.
DSH-08

Handle a percentage change from a zero baseline

TypeBoundaryPriorityHigh
Test data
A previous period value of zero, and a current value of zero after a positive period
Expected result
No division by zero, no infinity and no misleading figure. The interface shows a defined indicator rather than a number that cannot be computed.
DSH-09

Distinguish zero from no data

TypeStatePriorityHigh
Test data
A period with a genuine zero, and one where the source has not reported yet
Expected result
Rendered differently. A pending period shown as zero makes a chart look like a collapse in activity and triggers investigations into nothing.
DSH-10

Show an explicit empty state

TypeNegativePriorityHigh
Test data
A filter combination that matches no records
Expected result
A clear empty state naming the active filters, rather than a blank panel or a chart with axes and no series, which both read as a loading failure.
DSH-11

Apply row level permissions to every widget and export

TypeSecurityPriorityHigh
Test data
A restricted user viewing each widget, drilling down, and exporting
Expected result
Restricted records are absent from figures, from drill downs and from exports. An aggregate that includes hidden rows leaks their existence and their values.
DSH-12

Suppress an aggregate small enough to identify individuals

TypeSecurityPriorityMedium
Test data
A filter narrowing a group to a single record
Expected result
Documented suppression rule is applied where the data is sensitive, so a permitted aggregate cannot be narrowed until it reveals one person figures.
DSH-13

Refuse a widget or dashboard belonging to another account

TypeSecurityPriorityHigh
Test data
Request a dashboard identifier owned by another tenant, and a widget data endpoint directly
Expected result
Both refused. The data endpoint behind a widget needs its own authorisation rather than relying on the page that renders it.
DSH-14

Drill down to records that match the widget figure

TypeFunctionalPriorityHigh
Test data
Click a chart segment showing a count, then count the rows returned
Expected result
Row count equals the figure. A drill down that applies different filters than the aggregate is a defect even when both are individually defensible.
DSH-15

Carry filters into the drill down and back

TypeStatePriorityMedium
Test data
Apply two filters, drill down, then return to the dashboard
Expected result
Filters apply in the detail view and are still applied on return, rather than resetting and quietly changing every figure on the page.
DSH-16

Preserve dashboard state in the URL

TypeStatePriorityHigh
Test data
Set filters and a date range, then copy the URL into a new tab
Expected result
Identical view is restored, so a figure shared with a colleague is the figure they see rather than the default range.
DSH-17

Show data freshness honestly

TypeStatePriorityHigh
Test data
A dashboard served from a cache, and one where the pipeline is delayed
Expected result
The as at time is displayed and reflects the data rather than the page load, and a stale or delayed pipeline is surfaced rather than presented as current.
DSH-18

Handle a partial data failure per widget

TypeStatePriorityHigh
Test data
Make one widget query fail while the others succeed
Expected result
Failing widget shows its own error with a retry while the rest render. A single failure must not blank the dashboard or, worse, render as zero.
DSH-19

Round and format numbers without changing their meaning

TypeFunctionalPriorityHigh
Test data
Values requiring rounding, abbreviated large numbers, negative values and percentages
Expected result
Rounding is applied consistently, abbreviated values are unambiguous, the sum of rounded parts is not presented as an exact total, and units are always shown.
DSH-20

Format currency by the reporting currency, not the viewer locale

TypeBoundaryPriorityHigh
Test data
A dashboard viewed by users in two locales, with source records in two currencies
Expected result
Reporting currency is stated, conversion uses a documented rate and date, and mixed currency records are not summed as though they were one.
DSH-21

Scale the axis without misleading the reader

TypeFunctionalPriorityMedium
Test data
A series with a narrow range, one with an outlier, and one crossing zero
Expected result
Axis behaviour is documented and consistent, a truncated axis is labelled as such, and zero is visible where the chart implies proportion.
DSH-22

Render a large series without freezing the interface

TypePerformancePriorityHigh
Test data
A chart over 100,000 points and a dashboard of twelve widgets loaded together
Expected result
Load stays inside the stated budget through aggregation or sampling, sampling is disclosed, and the interface stays responsive while loading.
DSH-23

Load widgets independently rather than blocking

TypePerformancePriorityMedium
Test data
One deliberately slow widget among fast ones
Expected result
Fast widgets render immediately with their own loading states, and the slow one does not hold the whole page behind it.
DSH-24

Export a widget that matches what is displayed

TypeStatePriorityHigh
Test data
Export a chart underlying data with filters and a date range applied
Expected result
Export honours every active filter, the totals match the widget, and values beginning with an equals sign are neutralised so the file cannot execute formulas.
DSH-25

Schedule a report that matches the live dashboard

TypeStatePriorityMedium
Test data
A scheduled export delivered while the dashboard is viewed for the same period
Expected result
Figures agree, the schedule runs in a documented timezone, and the report states the period and the as at time it covers.
DSH-26

Rearrange and persist a customised layout

TypeStatePriorityMedium
Test data
Move and resize widgets, remove one, then reload and sign in on another device
Expected result
Layout persists per user, a removed widget stays removed, and a newly released widget appears without destroying the saved arrangement.
DSH-27

Remain readable on a narrow viewport and when printed

TypeCompatibilityPriorityMedium
Test data
A twelve widget dashboard on a mobile viewport and sent to print
Expected result
Widgets stack and remain legible, wide charts scroll inside their own container rather than the page body, and printing does not clip axes or legends.
DSH-28

Make every figure available without relying on colour or hover

TypeAccessibilityPriorityHigh
Test data
Screen reader navigation across widgets, and a chart distinguished only by colour
Expected result
Each widget exposes its figures as text or a table, series are distinguishable without colour alone, and values behind a hover tooltip are reachable by keyboard.

What goes in each field

ID

Required

Stable identifier, prefixed by module.

Test case

Required

What is being verified, in one line.

Type

Functional, negative, boundary, security, state, performance, accessibility or compatibility. Use it to check coverage is spread rather than clustered on the happy path.

Priority

Risk based, weighted by the decisions the number drives. Anything that reports a wrong figure plausibly, disagrees with another widget, or shows a user data outside their scope is High.

Test data

The specific values, including the invalid and boundary ones.

Expected result

Required

The precise observable outcome, including message text where the wording itself is the requirement.

How To Use This

Calculate one number by hand

A dashboard bug is not a broken screen, it is a believable wrong figure. These four conditions are how you find one.

Reconcile against the raw rows

Take a known data set, calculate the expected total by hand, and compare. Nothing else in this set proves the metric is correct rather than merely consistent.

Compare two widgets showing one measure

A summary tile and a chart built from different queries will drift apart. Users notice the disagreement and stop trusting every other figure on the page.

Separate zero from not yet reported

A pending period rendered as zero makes a chart look like activity collapsed. People investigate an outage that never happened, then learn to ignore the dashboard.

Drill down and count

Click a segment showing a count and count the rows returned. A drill down applying different filters than the aggregate is a defect even when both look defensible alone.

What Most Sets Miss

Why reporting defects go unreported

Dashboards fail differently from the rest of an application. A broken screen gets a support ticket within minutes; a wrong number gets acted on. Nobody can tell by looking whether revenue for last month should be that figure, so the only test that establishes correctness is reconciliation against the underlying records with a hand calculated expectation. Everything else confirms that the widget is stable, which is not the same thing. The second most valuable case is cross widget consistency, because two panels reporting the same measure from different queries will diverge, and that divergence is the thing users do notice and the thing that discredits the whole page.

Time is where aggregation quietly goes wrong. A day boundary depends on a timezone, and if that timezone is the viewer device rather than a documented reporting timezone, two people looking at the same dashboard see different numbers and both are convinced the other is mistaken. Ranges need consistent inclusivity so a record at the boundary is counted in exactly one period, and period comparisons need to state their span, because a month over month change across February and March is comparing twenty eight days with thirty one.

Empty and zero are different states and rendering them the same way causes real damage. A period where the pipeline has not reported yet is not a period with no activity, and showing it as zero turns a delayed job into an apparent business collapse. The related case is the honest freshness indicator: an as at time that reflects page load rather than the data behind it is worse than no indicator, because it actively asserts that stale figures are current.

Finally, aggregates leak. Row level permissions applied to a detail view but not to a summary let a restricted user infer the values they were not allowed to see, and narrowing a filter until a group contains one record turns a permitted aggregate into an individual disclosure. The widget data endpoint needs its own authorisation rather than trusting the page that renders it, and the export path needs the same filters and the same permissions as the screen, plus neutralisation of any cell starting with an equals sign so a downloaded file cannot execute formulas in the recipient spreadsheet.

Suggest an improvement

Testing a reporting or BI layer?

QAble tests analytics end to end, including reconciliation against source data, aggregation boundaries, permission enforcement in aggregates and export fidelity.

BI testing services

More test case sets

View all

Test cases for a login page

Test cases
25 cases across functional, negative, boundary, security, session and accessibility paths, including account enumeration and lockout.

Test cases for a registration form

Test cases
28 cases covering validation, duplicate accounts, email verification, password rules and the enumeration leak most signup forms ship with.

Test cases for search functionality

Test cases
28 cases across relevance, partial and fuzzy matching, filters, pagination, empty states, injection attempts and performance under load.

Test cases for a shopping cart

Test cases
27 cases on quantity limits, price recalculation, stock changes, coupon stacking, guest to account merge and cart persistence.

Test cases for checkout and payment

Test cases
30 cases including 3D Secure, declines, timeouts, duplicate charges, idempotency, refunds and partial captures.

Test cases for file upload

Test cases
28 cases on size and type limits, spoofed content types, malicious filenames, progress, resume, virus scanning and storage limits.

Test cases for forgot password

Test cases
26 cases on reset token expiry, single use enforcement, session invalidation and the enumeration and rate limit gaps that are routine here.

Test cases for OTP verification

Test cases
26 cases on expiry, resend throttling, attempt limits, code reuse, delivery failure and the brute force window teams forget to close.

Test cases for user roles and permissions

Test cases
26 cases on horizontal and vertical privilege checks, direct object access, role changes mid-session and permission inheritance.

Test cases for form validation

Test cases
27 rules-based cases on required fields, length and numeric boundaries, client and server parity, hidden field tampering and error accessibility.

Test cases for a date picker

Test cases
26 cases on timezone shifts, ambiguous day and month order, impossible dates, min and max limits, leap years and keyboard operation.

Test cases for pagination

Test cases
24 cases on ordering stability, records changing mid-session, page size caps, deep offset cost, permission-filtered totals and state restore.

Test cases for push notifications

Test cases
26 cases on app states, deep link routing, token release on sign out, lock screen privacy, preferences, provider failures and platform differences.

Test cases for reports and data export

Test cases
25 cases on permission filtering in the file, spreadsheet formula injection, encoding, typed numbers and dates, row limits and audit logging.

Test cases for a chatbot

Test cases
28 cases on paraphrased intents, context, fallback loops, human handoff, policy grounding, prompt injection and data scoping.

Test cases for net banking transactions

Test cases
28 cases on duplicate debits from a retried request, concurrent transfers against one balance, daily limits across channels, beneficiary cooling periods, second factor binding and reconciliation.

Test cases for wallet and UPI payments

Test cases
28 cases on payments that time out with no response, idempotency on retry, racing balances, caps across devices, collect request fraud, mandates and refunds.

Test cases for insurance claim submission

Test cases
28 cases on coverage at the date of loss, waiting periods, deductibles and sub limits, exclusions and riders, duplicate claims and settlement reconciliation.

Test cases for patient records in an EHR

Test cases
28 cases on duplicate detection and merge, wrong patient entry, units of measure, allergy and interaction alerting, break glass access and audit of reads.

Test cases for CRM lead management

Test cases
28 cases on duplicate leads under concurrency, routing and the unrouted fallback, round robin races, territory visibility, conversion and bulk import.

Test cases for an ERP purchase order

Test cases
28 cases on approval thresholds, amendments that must reset approval, budget commitment races, over receipt tolerance, three-way match and duplicate invoices.

Test cases for OTT video playback

Test cases
28 cases on bitrate recovery after a dip, DRM renewal mid stream, concurrent stream limits and leaked slots, resume conflicts, ad cue points and offline expiry.

Test cases for game level progression

Test cases
28 cases on save corruption during a crash write, cloud save conflicts, offline queue replay, unlock gating, currency exploits and purchase restore.

Test cases for a REST API

Test cases
28 cases on status code correctness, cross tenant resource access, mass assignment, idempotent retries, cursor pagination, rate limits and contract drift.

Test cases for SSO and social login

Test cases
28 cases on linking an account on an unverified email, state and code replay, redirect allow lists, token signature and issuer, deprovisioning and session rotation.

Test cases for subscription and billing

Test cases
28 cases on mid cycle proration, duplicate and out of order webhooks, renewal double charges, dunning and grace, trials, coupons, metered usage and tax.

Test cases for data tables, filters and sorting

Test cases
28 cases on unstable sorts across pages, filters that must reset pagination, selection surviving a filter change, bulk action scope and export fidelity.

Test cases for session timeout and concurrent login

Test cases
28 cases on tokens that survive sign out, refresh token reuse, idle against absolute lifetime, multi tab expiry, session limits and remote revocation.

Test cases for a multi step form wizard

Test cases
28 cases on values lost to back navigation, refresh and session expiry, step skipping, server side revalidation, duplicate submission and conditional branches.

Test cases for email verification

Test cases
28 cases on token reuse and expiry, invalidating earlier links, account enumeration, header injection, safe address change and mail scanner prefetching.

Test cases for booking and reservation

Test cases
28 cases on concurrent bookings for the last slot, inventory holds that leak, payment without a booking, cancellation boundaries and channel sync.

Test cases for mobile app install and update

Test cases
28 cases on migration chains across skipped versions, crashes during post upgrade migration, forced update lockouts, deep links and clean reinstall.

Test cases for accessibility (WCAG 2.2 AA)

Test cases
28 cases on keyboard only completion, focus management, live region announcements, contrast, reflow at 320 pixels, target size and screen reader verification.

Test cases for performance and load

Test cases
28 cases on spikes with no ramp, recovery after peak, soak and leak detection, pool exhaustion, cold caches, retry storms and data correctness under load.

Test cases for the OWASP Top 10

Test cases
28 cases on broken access control, mass assignment, injection across every input surface, credential stuffing, session invalidation, SSRF and exposed secrets.

Test cases for cross browser compatibility

Test cases
28 cases on storage that throws in private mode, blocked third party cookies, engine date parsing, mobile viewport units, in app browsers and ad blockers.

Test cases for database and data integrity

Test cases
28 cases on uniqueness under concurrency, lost updates, counter races, orphaned rows, migration and backfill safety, replica lag and verified restores.

Test cases for localisation and multi language support

Test cases
28 cases on text expansion, concatenated sentences, plural rules, locale date parsing, decimal separators, right to left layout, collation and encoding.

Want your reported numbers proven, not assumed?

QAble covers functional, boundary and data integrity paths with ISTQB-certified engineers. Start with a free QA audit of your platform.

Talk to QA Advisor