Skip to content

Engagement and process

Test automation for financial systems

Test automation for financial systems builds regression suites that check ledger entries, balances, amounts, exchange rates, and cut-off dates in CI on every release, against simulated processors and banks. Buyers receive an automation strategy with framework setup, a regression suite for critical money flows, CI pipeline integration with release gates, and a coverage and run time report.

What automated regression for money flows covers

A confirmation screen can show EUR 10.00 while the ledger holds two debits for the same transfer. Our suites therefore read ledger entries and balances through the API or the database, and the screen text is checked only where the screen sets the amount. A rounding, cut-off, or duplicate posting regression then fails a build before it reaches customer balances.

Money assertions

Every test that moves money compares integer amounts in the smallest currency unit, never parsed display strings or floating point values. The standard assertions are:

  • the entries of each transaction net to zero across debit and credit accounts;
  • each account balance after the test equals the sum of its entries;
  • each fee, interest, and proration amount equals a reference value computed outside the code under test, with the rounding rule named, as in the banker's rounding guide;
  • a request retried with the same idempotency key leaves exactly one set of entries.

Full matching against processor and bank files is the scope of ledger reconciliation testing. The regression suite runs the fast subset on every change.

Deterministic data for amounts, rates, and dates

We remove three sources of random results before the first test is written.

  • Amounts. Data builders create synthetic accounts for each test run, so parallel tests never share a balance. Amounts sit on rounding edges: half of the smallest unit, one smallest unit, and currencies with zero and three minor units, such as JPY and BHD.
  • Exchange rates. Each test loads a fixed rate table. Illustrative example with a synthetic rate: at a fixture rate of 1 EUR = 1.0850 USD less a 0.50% markup applied to the rate, a single EUR 250.00 transfer must credit USD 269.89 after rounding to the cent.
  • Dates and time. The system reads time from an injectable clock, or from a tool such as libfaketime where the code cannot change. Tests move the clock across a partner bank cut-off, a billing cycle from 31 January to 28 February, a leap day, and a daylight saving change, so accrual days and cycle boundaries are checked in seconds.

Simulators for processors and banks

A partner sandbox returns only the responses its operator supports, on the operator's schedule. We build HTTP simulators, with common open-source options such as WireMock or MockServer, that return on command a decline, a timeout after capture, a late or duplicate webhook, a partial settlement line, or a returned bank transfer. Tests use the simulators on every commit, and the real sandbox runs on a schedule.

Contract tests for partner APIs

Consumer-driven contract tests, with open-source tools such as Pact, record the requests your services send to a partner and the response fields they read. A scheduled job verifies those contracts against the partner sandbox, so a renamed field or a new status value fails a build before it breaks posting or settlement. Checks of your own published OpenAPI specification belong to API and webhook testing.

Where the first suite goes

For neobanks and BaaS programmes, the first suite covers card authorisation, top-up, and transfer postings. For acquiring, it covers authorisation, capture, and partial refund. For billing and accounting products, it covers proration, dunning retries, and invoice payments, and for spend management, card controls and accounting sync. For trading and crypto exchanges, it covers order fills, fees, deposits, and withdrawals. For payroll, it covers gross to net pay and pay run files, and for lending, repayment schedules and interest accrual. Browser and mobile end-to-end tests cover only the journeys where a screen sets an amount, such as a transfer confirmation.

Deliverables

  • Automation strategy and framework setup

    A document that selects the money flows and failure paths to automate at unit, API, contract, and end-to-end level, plus a working framework in the client's repository with synthetic data builders, a controllable test clock, and processor and bank simulators, for the engineering lead.

  • Regression suite for critical money flows

    Automated tests that run payments, transfers, refunds, and billing, payroll, or repayment cycles and check the resulting ledger entries, balances, fees, and converted amounts to the smallest currency unit, for the client's engineering team.

  • CI pipeline integration with release gates

    Continuous integration (CI) pipeline stages that run the suite on pull requests, merges, and release candidates, block a release when a money check or partner contract test fails, and keep each run record as change evidence for the engineering lead and a System and Organization Controls 2 (SOC 2) service auditor.

  • Coverage and run time report

    A report that maps each critical money flow and failure path to its automated tests, lists the flows still tested by hand, and records run time per pipeline stage and unstable tests per build, for the engineering lead and QA lead.

How automated suites fit your release process

Pull requests. Calculation, contract, and API-level money tests run against simulators. We agree a run time budget for this stage with your team and keep the stage inside it by running tests in parallel on isolated synthetic accounts. A failed money assertion blocks the merge and is never retried automatically until it passes.

Merge to the main branch. The full regression suite runs in a short-lived environment, for example containers started with Testcontainers, with a clean ledger database for each run.

Release candidate. End-to-end journeys run in staging against partner sandboxes, together with the scheduled contract checks. The release gate opens only when every critical money flow test passes. A quarantined unstable test stays in the report with a named owner and a fix date.

After release. A smoke run checks service health and, where the partner allows it, sends one synthetic transaction on a designated test account and confirms the entries it posted.

Test data. Accounts, cards, and employees are synthetic. No production cardholder data or account data enters CI, and card tests use the test card numbers each processor publishes for its sandbox.

Evidence. Each pipeline run stores the build, commit, test results, and change ticket. A SOC 2 service auditor samples such records as change evidence under criterion CC8.1, as the SOC 2 testing requirements page describes. Keep CI log retention longer than the examination period.

Handover. Suites live in your repository, in the language and test runner your team already uses, such as pytest, JUnit, or Jest, with a runbook for adding a flow. Your team owns the release decision, the run time budget, and the fix for each failure. If releases wait on manual regression today, start from QA bottlenecks slowing releases, and see manual testing vs automated testing for the trade-offs.

Sample deliverable

Sample, synthetic data

reconciliation test scenariosReconciliation test scenarios: card settlement and partner bank payouts
Reconciliation test scenarios: card settlement and partner bank payouts
IDScenarioExpected ledger entriesAmount (XTS)Expected reconciliation result
REC-01Processor settlement file repeats the settlement line for one captureDr Processor receivable / Cr Merchant payable, posted once120.00Break: the second settlement line has no matching capture and is flagged as a duplicate
REC-02Partial refund on a capture that settled the day beforeDr Merchant payable / Cr Processor receivable45.50Match: the refund line matches the refund entry and the original capture stays settled
REC-03FX rounding difference between the capture amount and the settled amountDr FX rounding expense / Cr Processor receivable0.01Match with a rounding entry when the difference is inside the configured tolerance
REC-04Processor fee line missing from the settlement fileDr Processing fee expense / Cr Processor receivable2.90Break: net settlement is lower than gross captures and a missing fee exception opens
REC-05Chargeback reversed after the merchant wins representmentDr Processor receivable / Cr Chargeback liability80.00Match: the reversal line clears the open chargeback entry
REC-06Refund request retried after a timeout, with the same idempotency keyDr Merchant payable / Cr Processor receivable, posted once30.00Break: the settlement file has two refund lines for one refund entry, and the second line is flagged as a duplicate refund
REC-07Partner bank credits the payout one business day after the expected value dateDr Partner bank cash / Cr Processor receivable1,000.00Match on the payout reference, with the value date difference logged as a timing item

Amounts use XTS, the ISO 4217 code reserved for testing. Account names are generic ledger accounts.

Questions

What is test automation?

Test automation is the use of code to run tests and compare actual results with expected results without a person executing each step. In a financial system, automated tests submit payments, transfers, or invoices through APIs and then check the resulting ledger entries, balances, and fees to the smallest currency unit on every code change.

What tests can be automated?

Tests with a fixed input and a checkable expected result can be automated: interest, fee, and proration calculations, ledger postings, partner API contracts, payment state transitions, and regression checks of existing flows. Exploratory testing, usability review, and the first checks of a new partner integration usually stay manual until the expected behaviour is known and stable.

Scope your test automation

Tell us which money flows you release most often and how long regression takes today. We return a first list of flows to automate and the release gates to add.

Scope your testing