Testing an ERP

ERP testing is different: the units are business processes, not functions; correctness means “the accounting entries are right”; and the cost of a defect reaching production is measured in misstated financials, not a bug ticket.

The test levels

Level Who Scope Question
Unit Developer One object Does this program work?
String Consultant A sequence of steps in one module Does this sub-process work?
Integration (SIT) Team End-to-end, cross-module Do the processes work together?
UAT Business users Real business scenarios Can we run our business on this?
Performance Technical Volume and load Will it work in production?
Security Security team Roles and authorisations Can people do only what they should?
Regression Team Everything previously working Did this change break something?
Cutover rehearsal Everyone The go-live procedure Can we execute the cutover in the window?
Parallel run Business Old vs new, same inputs Do we get the same numbers?

Testing the accounting — the ERP-specific discipline

The most important test in an ERP is not “did the screen work?” It’s “are the journal entries correct?”

Test case IT-042: Goods receipt for a stock purchase order

Given:
  PO 4500001, material FAB-1000, 500 EA @ 12.50, plant DHK1
  Material valuation: standard price 12.00, valuation class 3000
  Account determination: BSX → 120000, WRX → 231000, PRD → 520000

When:
  Post goods receipt, movement type 101, quantity 500

Then, assert EXACTLY these journal lines:
  120000  Inventory raw materials       Dr  6,000.00   (500 × 12.00 std)
  520000  Purchase price variance       Dr    250.00   (500 × 0.50 diff)
  231000  GR/IR clearing                Cr  6,250.00   (500 × 12.50 PO price)

And:
  Stock quantity DHK1/RAW increased by 500
  PO 4500001 line 10 open quantity reduced to 0
  Material document created with movement type 101
  Document flow links PO → material document

Assert the exact accounts and the exact amounts. “The posting succeeded” is not a test. This is what separates ERP testing from generic application testing, and it’s what catches account determination errors before the auditors do.

Build a library of these posting assertions — one per business event. They are your most valuable regression suite, because account determination configuration changes constantly and breaks silently.

Test scenarios, not test cases

Business users cannot execute “verify field VBAP-KWMENG accepts numeric input”. They can execute:

Scenario UAT-O2C-03: Export order with partial availability and split delivery

1. Create a sales order for customer Rahman Textiles (export, USD)
      Material FAB-1000, 1,000 EA, requested 15 April
2. Verify the system confirms 600 for 15 April and 400 for 28 April
      (two schedule lines — check availability was calculated correctly)
3. Verify the export price list applied (USD 14.20, not the domestic BDT price)
4. Verify the credit check passed (exposure 320,000 of a 500,000 limit)
5. Create the delivery for the first schedule line
6. Pick and post goods issue
7. Verify inventory reduced by 600 and COGS posted
8. Create the billing document
9. Verify the invoice shows: correct currency, 0% export VAT,
      the customer's PO reference, and Incoterms FOB Chattogram
10. Verify the AR open item created with the correct due date (LC 90 days)
11. Print the invoice — verify the layout, the tax statement, and totals in words

Written in business language, executed by the business, signed off by the business.

What to test that people forget

Area Because
Period boundaries Post on the last day and first day of a period
Fiscal year end Balance carryforward, number ranges, asset year change
Reversals and cancellations The correction path is used constantly and tested rarely
Partial everything Partial delivery, partial invoice, partial payment, partial receipt
Zero and negative Zero-value line, credit note, negative stock
Rounding Amounts that don’t divide cleanly; 3-decimal and 0-decimal currencies
Foreign currency With rate change between order and invoice
Blocked/blocked-for-X master data Every block type
Authorisation failures Does the user get a clear message, or a dump?
Concurrent access Two users on the same document
Large documents 500-line order, 2,000-line invoice
Missing configuration What happens when a tax code has no account assigned?
The unhappy path generally Most production defects are here

“Post an invoice on the last day of the fiscal year in a foreign currency for a customer whose credit limit was just reduced, then reverse it” catches more defects than a hundred happy-path tests.

Automated testing

Type Automate?
Posting logic and calculations ✅ Absolutely — the highest ROI
Custom program unit tests ✅ Yes
API/interface contract tests ✅ Yes
Data validation rules ✅ Yes
Regression of core processes ✅ Yes, worth the investment
Reports (data correctness) ✅ Yes
UI flows ⚠️ Brittle in ERP; automate only the highest-value paths
Print layout ❌ Visual review
UAT ❌ Human judgement is the point

Tools: the platform’s native framework (ABAP Unit, AL test codeunits, Odoo TransactionCase, Frappe tests), Tricentis Tosca (dominant in SAP), Worksoft, Selenium/Playwright for web UIs, plus your own API-level test harness.

The highest-value automated suite in any ERP is the posting assertion library, run on every configuration change and every transport. It’s also the cheapest to build, because it’s API-level, not UI-level.

Test data

The hardest practical problem in ERP testing.

Approach Pros Cons
Production copy Realistic, full volume Personal data, salaries, prices — a privacy breach waiting to happen
Masked production copy Realistic and compliant Masking must be thorough and consistent across tables
Synthetic No privacy issue Never covers the weird real cases
Curated golden dataset Repeatable, stable Effort to build and maintain

Masking rules: names, addresses, emails, phone numbers, tax IDs, bank accounts, salaries, and personal identifiers. Masking must be referentially consistent — customer 100 must have the same masked name in every table, or joins break and the data becomes useless for testing.

Copying unmasked production HR or customer data to a test system is a reportable data breach in most jurisdictions. This is not a theoretical risk; it’s a common audit finding.

Performance testing

What to test:
  - Interactive response time at peak concurrency
  - The month-end close batch chain, at full volume
  - The heaviest reports against full data
  - MRP / settlement / depreciation runs
  - Peak-day order entry (Black Friday, season start, month-end)
  - Interface throughput at peak
  - Concurrent batch + interactive load together

Against:
  - Production-volume data (a full masked copy)
  - Production-equivalent hardware
  - Realistic concurrency

“It was fast in DEV with 500 records” is the epitaph of many go-lives. Performance test before UAT, not after — if a report needs redesigning, you want to know while there’s still time.

Regression testing

Every configuration change and every transport can break something unrelated. Configuration is global; a change to account determination affects every module that posts.

Build a core regression pack: 30–60 scenarios covering the critical end-to-end flows and their expected postings. Run it:

  • Before every transport to production
  • After every support pack or version upgrade
  • Before every month-end
  • After any configuration change to a shared object

This is the single highest-value testing investment on an ERP project, and it pays off for the entire life of the system, not just the project.

UAT — getting it right

UAT fails when it’s treated as a formality. What makes it work:

  1. Real users, not IT. The person who does the job daily.
  2. Real scenarios, drawn from actual past transactions.
  3. Real data — their own customers, their own materials.
  4. Protected time — users released from their day job, not doing UAT “when they get a chance”.
  5. A defect process with triage, severity, and daily review.
  6. Exit criteria agreed in advance: e.g. zero critical, zero high, ≤5 medium with workarounds.
  7. Sign-off by process owners, documented.

Defect severity:

Critical  Cannot go live. Wrong postings, data loss, process blocked
High      Major impact, no acceptable workaround
Medium    Impact with a workaround
Low       Cosmetic, minor inconvenience

Watch for severity inflation. Everything becomes “critical” near go-live. A triage meeting with the process owner and the project manager, held daily, keeps it honest.

The parallel run

For payroll and financial reporting, run old and new simultaneously and reconcile:

Payroll parallel run, 2–3 cycles:
  Legacy gross    18,442,110      New gross    18,442,110   ✅
  Legacy tax       2,118,340      New tax       2,118,290   ❌ diff 50
  → investigate: 3 employees with a mid-month grade change,
    retro calculation differs → fix, rerun, reconcile again

Non-negotiable for payroll. Also strongly advised for the first month-end financial close. It is exhausting for the staff running two systems, and it is the reason payroll go-lives succeed.

The go/no-go criteria

Agreed in advance, objectively assessed:

  • UAT complete, exit criteria met, signed off by all process owners
  • Zero critical and zero high open defects
  • Data migration reconciled and signed off per object
  • Opening balances reconcile exactly to legacy
  • Performance test passed at production volume
  • Security/authorisation test passed
  • Cutover rehearsal completed within the window
  • All interfaces tested with real partners
  • Users trained; training attendance recorded
  • Support model in place and staffed
  • Rollback plan documented and rehearsed
  • Business sign-off obtained

Going live with open critical defects is how projects become case studies. If the criteria aren’t met, the correct answer is to move the date. That decision is uncomfortable and almost always cheaper than the alternative.

Next