View all services
Talk to QA Advisor
Browse the Knowledge Hub74 resources
/Test Cases/CSV import and bulk operation test cases

Test cases

Import test cases, for the file that gets uploaded twice

Twenty eight cases covering reruns that must not duplicate successes, per row failure reporting, dry runs, delimiters and line breaks inside quoted fields, byte order marks and encoding, leading zeros, ambiguous dates, locale decimal separators, formula injection on export, streaming large files and bulk action scope.

28cases/8coverage types/10negative 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

IMP-01

Import a well formed file successfully

TypeFunctionalPriorityHigh
Test data
A file of 500 valid rows
Expected result
All 500 are created, the reported count matches the rows in the file exactly, and a summary states created, updated and skipped separately.
IMP-02

Rerun a corrected file without duplicating successes

TypeStatePriorityHigh
Test data
Import 1,000 rows where 40 fail, correct them, then upload the whole file again
Expected result
Only the 40 are created. Matching on a stable key rather than blindly inserting is what makes the natural user behaviour safe.
IMP-03

Report per row failures with a reason

TypeNegativePriorityHigh
Test data
A file mixing validation failures, duplicates and permission failures
Expected result
Each failure is reported with its row number and a specific reason, and an error file is downloadable so the user can fix and resubmit only those rows.
IMP-04

Offer a dry run before committing

TypeFunctionalPriorityHigh
Test data
A validation pass over a file with known problems
Expected result
Reports what would be created, updated and rejected without writing anything, so a 10,000 row mistake is caught before it is made.
IMP-05

Decide the failure policy explicitly

TypeStatePriorityHigh
Test data
A file where row 400 of 500 fails
Expected result
Either all rows are rolled back or valid rows are committed with failures reported, and the interface states which before the import starts.
IMP-06

Handle a delimiter inside a quoted field

TypeNegativePriorityHigh
Test data
A field containing commas, one containing quotes, and one containing an escaped quote
Expected result
Parsed to the correct column count. A naive split on the delimiter shifts every subsequent column and corrupts the row silently.
IMP-07

Handle a line break inside a quoted field

TypeNegativePriorityHigh
Test data
A notes column containing an embedded newline
Expected result
Treated as one row rather than two, and the row count reported matches the logical rows rather than the physical lines.
IMP-08

Handle encoding and a byte order mark

TypeNegativePriorityHigh
Test data
A file saved with a byte order mark, one in a legacy encoding, and one containing accented characters and emoji
Expected result
Characters survive intact and the mark does not become part of the first column name, which is the reason a header is not recognised.
IMP-09

Handle alternative delimiters and line endings

TypeCompatibilityPriorityMedium
Test data
A semicolon separated file, a tab separated file, and files with each line ending convention
Expected result
Detected or selectable, and mixed line endings within one file do not produce trailing whitespace on every value.
IMP-10

Validate and map the header row

TypeNegativePriorityHigh
Test data
Reordered columns, a missing required column, an unexpected extra column, and duplicate headers
Expected result
Mapping is by header name rather than position, missing required columns are refused with the name, and duplicates are rejected rather than one silently winning.
IMP-11

Handle a file with no header or no data rows

TypeNegativePriorityMedium
Test data
An empty file, a header only file, and a file whose first row is data
Expected result
Each produces a clear message rather than a success reporting zero rows, which reads to the user as the import having worked.
IMP-12

Preserve leading zeros and long numeric strings

TypeNegativePriorityHigh
Test data
A postcode with a leading zero, a long account number, and a value in scientific notation
Expected result
Stored as text exactly as supplied. Coercing to a number drops the leading zero and rounds long identifiers, corrupting the record permanently.
IMP-13

Parse dates using an explicit format

TypeBoundaryPriorityHigh
Test data
Ambiguous dates such as 03/04/2026, an unambiguous one, and an impossible date
Expected result
Format is stated or selected rather than guessed per row, and an impossible date is rejected rather than rolled forward silently.
IMP-14

Parse numbers using the expected locale

TypeBoundaryPriorityHigh
Test data
A value using a comma decimal separator and one using space grouping
Expected result
Interpreted per the stated locale, since parsing a comma decimal as a thousands separator changes the value by a factor of a thousand.
IMP-15

Trim and normalise values consistently

TypeNegativePriorityMedium
Test data
Leading and trailing spaces, a non breaking space, and mixed case in an email
Expected result
Normalised identically to values entered through the interface, so an imported record matches a manually created one for deduplication.
IMP-16

Detect duplicates within the file itself

TypeBoundaryPriorityHigh
Test data
A file containing the same logical record twice on different rows
Expected result
Flagged before writing rather than the second silently overwriting the first, and the behaviour matches the documented rule.
IMP-17

Enforce the same validation as the interface

TypeSecurityPriorityHigh
Test data
Rows violating required fields, formats, and business rules enforced in the form
Expected result
Refused identically. An import path with weaker validation is the standard route by which invalid data enters an otherwise clean system.
IMP-18

Enforce permissions on every imported row

TypeSecurityPriorityHigh
Test data
A file containing rows referencing another tenant, and rows the importer may not create
Expected result
Rejected per row with a reason, and authorisation is evaluated per record rather than once for the file.
IMP-19

Neutralise formula content in an exported file

TypeSecurityPriorityHigh
Test data
A stored value beginning with an equals sign, exported and opened in a spreadsheet
Expected result
Prefixed or quoted so it cannot execute, since an export that runs a formula on the recipient machine is a real attack rather than a formatting quirk.
IMP-20

Cap file size and row count

TypeBoundaryPriorityHigh
Test data
A file at the documented maximum, one above it, and one with far more rows than expected
Expected result
Accepted then refused with the limit stated, rather than accepted and then timing out halfway with an unclear partial result.
IMP-21

Stream a large file rather than loading it wholly

TypePerformancePriorityHigh
Test data
A file at the maximum supported size
Expected result
Processed with bounded memory, since reading the whole file into memory to parse it fails at exactly the size a real customer will upload.
IMP-22

Run a large import asynchronously with progress

TypeStatePriorityHigh
Test data
An import large enough to exceed a request timeout
Expected result
Runs in the background with visible progress and a notification on completion, rather than holding a request open until the browser gives up.
IMP-23

Resume or restart safely after an interrupted import

TypeStatePriorityHigh
Test data
Kill the worker at 60 per cent through an import
Expected result
Resumes from durable progress or restarts without duplicating the rows already written, and the partial state is visible rather than silent.
IMP-24

Prevent two imports of the same file running together

TypeBoundaryPriorityHigh
Test data
Upload the same file twice in quick succession
Expected result
Second is rejected or queued, since two concurrent imports of the same rows will both pass their duplicate checks and both write.
IMP-25

Undo a completed import

TypeStatePriorityHigh
Test data
An import that created 1,000 records, reverted afterwards
Expected result
A documented rollback path exists and records subsequently edited by a user are handled explicitly rather than silently deleted.
IMP-26

Apply a bulk action to the intended set only

TypeSecurityPriorityHigh
Test data
A bulk update where select all covers a filtered set, then the filter changes before the action runs
Expected result
Action applies to the set the user confirmed, with the count shown, rather than to whatever the filter matches at execution time.
IMP-27

Handle a bulk delete with partial failures

TypeNegativePriorityHigh
Test data
A bulk delete of 200 records where 15 are referenced elsewhere
Expected result
Deletable records are removed, blocked ones are reported individually with the reason, and the result is not presented as a blanket success.
IMP-28

Provide a template and worked example

TypeFunctionalPriorityMedium
Test data
The downloadable import template
Expected result
Contains the exact expected headers with an example row, and a file produced from the template imports without modification.

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. Anything that silently drops a row, duplicates rows on a rerun, or applies a bulk action to records outside the intended set is High. Encoding faults are High because they corrupt data permanently.

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

Fix forty rows and upload it again

Importing a clean file works. These four conditions are where imports corrupt data or create it twice.

Rerun the whole corrected file

This is what every user does after a partial failure. If the importer inserts rather than matching on a key, the 960 rows that already succeeded are now there twice.

Put a comma inside a quoted field

A naive split on the delimiter shifts every subsequent column. The row is corrupted silently and nothing errors, because the values are all still strings.

Save the file from a spreadsheet with a BOM

The byte order mark becomes part of the first column name, so the header is not recognised and a required column appears to be missing. Users cannot diagnose this.

Import a postcode starting with zero

Coerced to a number, the zero is gone and long account numbers get rounded into scientific notation. The corruption is permanent and invisible at import time.

What Most Sets Miss

Why imports corrupt data quietly

The rerun is the single most valuable case in this set because it is what real users do. An import of a thousand rows reports forty failures, the user fixes those forty in the original spreadsheet, and uploads the whole file again, because that is the obvious thing to do. An importer that inserts rather than matching on a stable key now has 960 duplicates and no way to tell which is which. Making the import idempotent on a business key turns the natural behaviour into the safe behaviour, and it is far more effective than telling users to upload only the failed rows.

CSV parsing is deceptively hard and the failures are silent. A delimiter inside a quoted field shifts every subsequent column, so the row lands with the right number of values in the wrong places and nothing validates as broken. A line break inside a quoted notes field turns one logical row into two physical lines, so the count reported disagrees with the file. A byte order mark attaches itself to the first header name, so a required column appears absent for reasons the user cannot see. None of these produce a parse error; they produce wrong data.

Type coercion is where identifiers get destroyed permanently. A postcode with a leading zero, a long account number, a product code that looks numeric: coerced to a number, the zero disappears and anything long enough is rounded into scientific notation. Dates have the same shape of problem in a different guise, since 03/04/2026 means two different days and guessing per row will produce a file where some dates are right and some are not. The fix in both cases is to state the format and store as text rather than infer.

Finally, the operational cases. A large import has to stream rather than load the whole file, because loading it into memory works in testing and fails at exactly the size a real customer uploads. It has to run asynchronously with progress, because a synchronous import will exceed a request timeout and leave the user with no idea what happened. And it needs a dry run, because catching a mapping error before writing ten thousand rows is worth considerably more than any amount of error reporting afterwards.

Suggest an improvement

Testing an import or data migration path?

QAble tests bulk data paths end to end, including rerun safety, parsing and encoding edge cases, validation parity with the interface and behaviour at real file sizes.

Big data 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 dashboards and analytics widgets

Test cases
28 cases on reconciling against source rows, widgets that disagree, timezone aggregation, zero baselines, no data shown as zero and permission leaks in aggregates.

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.

Test cases for outbound webhooks

Test cases
28 cases on retry backoff and dead letter stores, one dead consumer degrading the pipeline, payload signing and replay windows, out of order delivery and endpoint SSRF.

Test cases for background jobs and queues

Test cases
28 cases on work outliving the visibility timeout, idempotent handlers, poison messages, priority starvation, scheduler overlap across instances and graceful drain.

Test cases for real time features and websockets

Test cases
28 cases on messages lost in the reconnect gap, half open connections, per channel authorisation, tokens expiring mid connection, backpressure and fanout across instances.

Test cases for file storage and media processing

Test cases
28 cases on signed URL scope and expiry, serving before scanning completes, content type sniffing, metadata stripping, orphaned objects and derivative failures.

Test cases for feature flags and progressive rollout

Test cases
28 cases on unreachable flag services, unstable bucketing, rollouts that reshuffle users, kill switch latency, server and client mismatch and stale flags.

Test cases for Android app lifecycle and permissions

Test cases
28 cases on state lost to process death, configuration changes, permanent permission denial, revocation while backgrounded, doze and battery restrictions.

Test cases for iOS app lifecycle and permissions

Test cases
28 cases on the keychain surviving uninstall, suspended termination, limited photo access, allow once location, app switcher snapshots and biometric invalidation.

Test cases for wearable app sync

Test cases
28 cases on data recorded away from the phone, duplicate records on resync, full buffers, clock drift, health permissions, battery budgets and unworn readings.

Test cases for VR and AR experiences

Test cases
28 cases on the frame rate comfort floor, tracking loss, guardian boundaries, involuntary camera movement, AR anchor drift and spatial data privacy.

Test cases for IoT device pairing and telemetry

Test cases
28 cases on offline buffering and reconnect floods, fleet wide reconnection storms, shared credentials, wrong device clocks and stale queued commands.

Test cases for embedded firmware update

Test cases
28 cases on power loss mid write, automatic rollback and health confirmation, signature and anti rollback checks, staged rollouts and recovery mode.

Test cases for user profile and account settings

Test cases
28 cases on partial saves reported as success, optimistic updates the server rejected, mass assignment through a profile form, avatar content inspection and session invalidation.

Test cases for account deletion and data export

Test cases
28 cases on export links that must be authorised and expiring, deletion cascading to storage, caches, logs and processors, grace periods, legal holds and deadlines.

Test cases for consent and cookie management

Test cases
28 cases on cookies and tracking requests firing before consent, reject parity with accept, tag manager bypass, withdrawal, cached banners and server side forwarding.

Test cases for notification preferences and delivery

Test cases
28 cases on opt outs honoured on one channel and ignored on another, marketing sent as transactional, unsubscribe scope, imports resetting consent and digest timezones.

Test cases for admin impersonation and support access

Test cases
28 cases on actions attributed to the customer instead of the admin, credential exposure, chained and upward impersonation, session expiry and immutable access records.

Test cases for audit logs and activity history

Test cases
28 cases on forged entries through log injection, immutability and tamper detection, actor attribution across impersonation and jobs, retention and legal holds.

Want your import path 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