Skip to content
Display settings
Reading preferences

Saved only in this browser.

Menu navigation
Services
EnterpriseGrowthCoffee BreakAll categoriesRequest a free consultation

Integration Failure Testing for Quality Leaders: Ten Drills and Go/No-Go Controls Before Go-Live

Executive brief

For teams evaluating testing-automation-service

Use this guide to frame business fit, implementation effort, delivery risk, operating impact, and expected value before choosing a path.

  • Clarifies the decision, constraints, and practical outcomes.
  • Connects the topic to relevant CISIN expertise and delivery options.
  • Helps decision makers compare technology, operational, and adoption tradeoffs.
View related serviceRequest a free consultation
Integration Failure Testing: A Go/No-Go Drill Plan
Integration Failure Testing: A Go/No-Go Drill Plan

Most integration defects that cost real money are not logic bugs. They are timing bugs: a response lost after a commit, a retry that arrives while the first attempt is still running, an event delivered twice or out of order, or a record that two tenants happen to describe with the same identifier. Standard test suites rarely produce these conditions, so the first real test happens in production, with real invoices, orders, and customer records.

Integration failure testing is the deliberate injection of those conditions before go-live, with a pass or fail rule tied to authoritative state rather than to HTTP status codes. This guide is written for the Head of Quality Engineering, or the VP who owns release readiness, who has been asked to sign off an integration that creates, changes, or cancels something consequential: a payment, a shipment, an entitlement, a ledger entry.

It proposes a ten-drill test design and a set of mandatory go/no-go controls. The design is a proposal from CIS, built from documented vendor and protocol behavior. It is not an industry standard or a certification, and passing it does not certify a system as production-ready. It establishes which failure conditions you have tested, and which you have consciously accepted.

It complements our earlier guides on idempotent webhooks and API retries, reconciling unknown-outcome operations after an outage, and evaluating a vendor's delivery guarantees. Those pieces explain how to design and select. This one explains how to prove.

Key Takeaways

  1. Bottom line: An integration is not ready because its happy path passes. It is ready to be considered for release when each failure condition that can duplicate, lose, or corrupt a consequential change has been injected and the outcome verified against the system of record.
  2. Delivery is usually at-least-once. Queues, webhooks, and retrying clients are documented to deliver duplicates and, often, out of order. Duplicates are a normal operating condition, not an edge case.
  3. An unknown result is not a success and not a failure. It means completion could not be confirmed. After an ambiguous timeout, reconcile authoritative state before any new attempt.
  4. Idempotency must be tenant-scoped and payload-bound. A durable operation identity is tied to an immutable, approved payload hash. Reusing the identity with a changed payload must be rejected.
  5. Receipt and scheduling must be atomic. Record the delivery and schedule the work in one transaction before you acknowledge it, or make the gap explicitly recoverable.
  6. Use mandatory controls, not a summed score. Every control in the go/no-go list is required. A high average does not compensate for a missing control.
  7. Identifiers can be sensitive. Idempotency keys, replay stores, and dead-letter queues need a named privacy owner and a retention rule.

Why Integration Tests Pass While Production Still Duplicates, Drops, or Corrupts Changes

Key takeaway: The platforms underneath your integration openly document that duplicates, retries, and reordering happen. A test plan that never produces them is testing a system that does not exist.

Quality teams are often handed an integration with a clear functional specification: when a contract is signed in the CRM, create the customer and the subscription in billing. The tests confirm that it does. What the specification rarely says is what must happen when the same event arrives twice, when the billing system commits but the response never returns, or when two workers pick up the same job at the same moment.

Those are not exotic. They are documented behaviors of the building blocks most integrations rely on. The table below summarizes what several primary sources state, and the scope of each statement. The scope matters: a protocol rule about HTTP methods is not a guarantee about your business operation, and one vendor's idempotency window is not a standard.

Building blockWhat the primary source saysWhat you still own
HTTP method semantics (RFC 9110)Defines which methods are idempotent by specification. POST is not among them.Making a POST that creates or changes something safe to repeat. The protocol will not do it for you.
Standard message queues (Amazon SQS standard queues)At-least-once delivery: a message may occasionally be delivered more than once, and ordering is best effort.Consumers that tolerate duplicates and reordering.
Vendor webhooks (Stripe webhook documentation, one example)Events can be delivered more than once, are not guaranteed to arrive in generation order, and are retried for up to three days in live mode.Logging processed event IDs, not depending on order, and returning a success code only when it is true.
Vendor idempotency keys (Stripe idempotent requests, one example)The client generates the key. Retention is vendor-specific (24 hours for API v1, 30 days for API v2). Reusing a key with different parameters is an error.Key lifecycle, scope, and what happens after the vendor's window closes.

We cite one payment vendor because its documentation is explicit and public. Your own vendors may differ, which is precisely why the test plan must be built from their documented behavior and then confirmed against it. If a vendor does not document a behavior, treat it as unknown and test for the worst plausible case.

The cost of an unexamined retry

Consider an illustrative scenario, not a measured result. An order-sync service processes 200,000 events a day. If even 0.1 percent are redelivered, that is 200 duplicate deliveries a day. If each duplicate has a one in a hundred chance of reaching a code path that is not idempotent, the team creates two consequential errors daily, each needing manual correction. The figures are invented to show the arithmetic: small duplicate rates become routine operational work once volume is high, and nobody sees them in a staging environment that processes fifty events.

How Most Teams Test Integrations, and Why That Approach Fails

Key takeaway: Common integration tests prove that a retry mechanism exists. They do not prove that a retry is safe.

The typical integration test pack has four layers: unit tests on the mapping logic, contract tests on field names and types, a happy-path end-to-end run in a staging environment, and a load test on throughput. Each is valuable. None of them asks the question that decides whether a consequential mutation is safe: what happens to the target system's state when delivery misbehaves?

Common practiceWhat it actually provesWhat it misses
Mocked downstream API that always answersThe client parses a valid response.Timeouts after commit, partial failures, slow responses, and changed behavior under load.
Single-worker staging environmentSequential processing works.Two workers claiming the same job, lease expiry, and race conditions.
"Retry succeeds" testA second attempt eventually gets a 2xx.Whether the second attempt created a second record.
One tenant in test dataThe logic is correct for one customer.Key collisions and data leakage across tenants.
Counting any 2xx as successThe receiver answered.Whether the work was durably accepted, let alone completed.
Load test with unique eventsThroughput is adequate.Behavior when 5 percent of events are duplicates or arrive out of order.

There is also a measurement problem. Test dashboards usually report pass rates. A suite with 98 percent passing looks healthy, yet the two percent that fail may be the only tests touching money. The same applies to any weighted readiness score: it lets strength in one area hide a gap in another. For consequential mutations, readiness must be expressed as a list of required controls, each with evidence, not as a number.

Finally, many teams treat the integration as a feature rather than as a distributed system with its own failure modes. Feature teams own the mapping logic, platform teams own the queue, a vendor owns the target API, and nobody owns the behavior across all three. Failure testing is how you create that ownership before an incident does it for you.

A Proposed Design: Ten Failure Drills for Consequential Mutations

Key takeaway: Each drill injects one fault, states a hypothesis, and defines pass evidence taken from the system of record. If you cannot name the evidence, you cannot run the drill.

The ten drills below are a proposed design from CIS. They are not an established proprietary method, an ISO or NIST standard, or a benchmark. The approach borrows its discipline from the published Principles of Chaos Engineering: define steady-state behavior, form a hypothesis, introduce events that resemble real-world faults, and limit the blast radius. The difference here is that the steady state is a business invariant, such as "one approved payment produces exactly one ledger entry," and the evidence is read from the authoritative system, not from the integration's own logs.

#DrillFault injectedPass evidenceFail signal
1Concurrent duplicate deliverySend the same event twice at the same instant.Exactly one change in the target. One recorded operation.Two records, or one record plus an unexplained error.
2Same identity, changed payloadResend the operation identity with a different amount or recipient.Request rejected. Original change untouched. Mismatch recorded.Silent overwrite, or silent return of the original result as if the new request succeeded.
3Ambiguous timeout after commitLet the target commit, then drop the response.Caller marks the operation unknown, queries authoritative state, and resolves it. No new attempt before reconciliation.Blind retry with a new key, or the operation marked failed.
4Crash between receipt and schedulingKill the receiver after it accepts a delivery.Either the delivery was not acknowledged and is redelivered, or the record and scheduled work both survive restart.Acknowledged delivery with no recorded work.
5Out-of-order and stale eventsDeliver "updated" before "created," and an old version after a new one.Final state reflects the newest valid version. Unresolvable ordering is held, not guessed.Stale data overwrites newer data.
6Uncertain inputSend malformed, unsigned, unknown-version, and missing-field payloads.Quarantined with a reason. No mutation. Owner alerted.Best-effort guessing, default values applied, or silent drop.
7Concurrent worker claimStart multiple workers against one scheduled item. Expire a lease mid-run.One worker performs the mutation. An expired lease routes to reconciliation, not automatic re-execution.Both workers act, or a reclaimed job repeats an unconfirmed change.
8Cross-tenant identity collisionUse the same operation identity for two tenants.Two independent operations. No data visible across tenants.Second tenant receives the first tenant's result, or is blocked.
9Terminal failureMake the target reject permanently, and exhaust retries.Operation moves to a terminal state with a named owner, an alert, and a documented resolution path.Message dropped, or sits in a dead-letter queue nobody reads.
10Legitimate later operationSubmit a second, genuinely new operation with identical business content (for example, a second equal refund).Treated as a new operation because its identity differs. Not suppressed as a duplicate.Valid second operation silently discarded.

Drill 10 deserves special attention

Teams that over-correct on duplicates create the opposite defect. If identity is derived only from payload content, two legitimate refunds of the same amount to the same customer collapse into one. Identity should express business intent, supplied by the originating workflow or user action, and the payload hash should be bound to that identity to detect tampering or bugs. Identity answers "which operation is this?" The hash answers "is this still the operation that was approved?"

An illustrative skeleton that upholds the invariants

The sketch below is illustrative only. It is not an official API contract for any product, and it must be adapted to your datastore, isolation level, and the target system's actual capabilities. It shows four properties your drills should verify: tenant-scoped identity, payload binding, atomic receipt plus scheduling, and an atomic claim that routes expired leases to reconciliation instead of re-execution.

-- ILLUSTRATIVE SKETCH: adapt to your datastore and verify against your own contracts. CREATE TABLE operation_ledger (   tenant_id     text        NOT NULL,   operation_id  text        NOT NULL,  -- business-intent identity; avoid raw emails or personal IDs   payload_hash  bytea       NOT NULL,  -- hash of the approved, canonicalized payload   state         text        NOT NULL DEFAULT 'received',   lease_owner   text,   lease_expires timestamptz,   PRIMARY KEY (tenant_id, operation_id) );  -- 1) Receipt and scheduling in ONE transaction, before acknowledging delivery. BEGIN; INSERT INTO operation_ledger (tenant_id, operation_id, payload_hash) VALUES ($1, $2, $3) ON CONFLICT (tenant_id, operation_id) DO NOTHING; -- If no row was inserted, load the stored payload_hash. -- A different hash means: reject the request and never overwrite the original. INSERT INTO work_outbox (tenant_id, operation_id) VALUES ($1, $2) ON CONFLICT DO NOTHING; COMMIT;  -- acknowledge only after this succeeds  -- 2) Atomic claim by a worker (expired leases are NOT re-claimed here). UPDATE operation_ledger SET state = 'in_progress', lease_owner = $3, lease_expires = now() + interval '2 minutes' WHERE tenant_id = $1 AND operation_id = $2 AND state = 'received' RETURNING operation_id;  -- zero rows: another worker owns it  -- 3) A separate sweeper moves expired in_progress rows to 'unknown_outcome'. --    Those rows are reconciled against the target system, never blindly replayed.  -- 4) Target-side conditional mutation (compare-and-set performed BY the target). UPDATE invoices SET status = 'paid', version = version + 1 WHERE tenant_id = $1 AND invoice_id = $2 AND status = 'open' AND version = $3;

Note the last statement. Reading a record, comparing it in application code, and then writing is not compare-and-swap: another writer can change the record between the read and the write. The condition has to be evaluated by the target at the moment of mutation, as in the WHERE clause above, or through an equivalent such as a version check or an entity tag precondition where the target supports one. If the target system offers no conditional mutation, the honest answer is to serialize writes per entity and disclose the throughput and failure-handling limits that creates. Drill 7 should test that disclosed limit.

For background on keeping the state change and the outgoing message consistent, the transactional outbox pattern describes the commonly used approach. Whichever variant you choose, the drill is the same: kill the process at each step and show that nothing acknowledged is lost and nothing unconfirmed is repeated.

Mandatory Go/No-Go Controls: What Every Release Decision Must Contain

Key takeaway: These controls are all required. There is no scoring threshold, and a missing control cannot be offset by strength elsewhere. Passing them establishes tested boundaries, not production certification.

The list below translates the drills into release criteria. Each control needs evidence a reviewer can inspect: a test run, a configuration, a runbook, or a named owner. If a control cannot be met, the decision is either no-go or a written, time-limited risk acceptance signed by someone with authority over the affected business process. A risk acceptance is not a pass.

Required controlEvidence requiredLinked drills
Verified acknowledgment. A success response to the sender means "durably accepted," not "processed."Test showing the acknowledgment is issued only after the record and the scheduled work are durably stored. Restart test results.1, 4
Atomic or explicitly recoverable receipt and scheduling.Single-transaction design, or a documented recovery job with a drill proving it closes the gap.4
Tenant-scoped idempotency identity.Uniqueness constraint including tenant. Cross-tenant collision test.8
Payload binding. Identity bound to an immutable approved payload hash. Changed-payload reuse rejected.Stored hash. Test with altered amount or recipient. Rejection logged without storing sensitive content unnecessarily.2
Atomic work claim.Conditional claim statement or equivalent. Concurrent-worker test. Lease-expiry behavior documented.7
Target-side conditional mutation, or disclosed serialization limits.Target contract showing a version, entity-tag, or state precondition, or a written statement of the serialization approach and its throughput ceiling.1, 7
Ambiguous-timeout handling. Unknown outcome is a distinct state. Reconcile authoritative state before any new attempt.State model with an "unknown" state. Reconciliation runbook. Drill with a dropped response.3
Terminal-failure handling.Defined terminal states, named owner, alert route, and resolution path. Evidence the owner has seen a test alert.9
Uncertain-input handling. Unverifiable or unrecognized input is quarantined, not guessed.Signature verification and schema-version checks. Quarantine test.5, 6
Legitimate repeat operations preserved.Test where a genuine second operation with identical content succeeds.10
Privacy ownership. Keys, replay stores, logs, and dead-letter queues have a named owner, a retention rule, and minimized content.Data inventory entry per store. Retention configuration. Confirmation that raw sensitive data is not used as a key.2, 8, 9

What the Head of Quality Engineering should insist on

  1. Evidence from the system of record. A passing drill is confirmed by querying the target, not by reading the integration's own success log.
  2. A distinct unknown state in the data model. If the schema has only "success" and "failed," ambiguous timeouts will be forced into one of them.
  3. Authority to block. The release owner needs the right to stop a go-live when a required control lacks evidence, with escalation, not negotiation, as the route to overrule.
  4. Named owners. Every dead-letter queue, replay store, and quarantine area needs a person or team, not a shared mailbox.
  5. A re-run trigger. Changes to the payload schema, vendor API version, retry configuration, or retention policy re-open the relevant drills.

Scope notes that prevent over-claiming

Idempotency is not a general solution. The HTTP specification describes idempotency as a property of method semantics, meaning that repeating the request has the same intended effect. Your end-to-end business operation may involve several calls, an email, and a notification. Safe repetition of one call does not make the whole sequence safe. Likewise, identifiers can themselves be sensitive. The Stripe documentation, for instance, advises avoiding sensitive data such as email addresses or personal identifiers as idempotency keys. Treat that as a general design lesson, and see our guide on privacy governance for integration event logs for the data-ownership side. Whether a specific regulation applies to your replay stores is a question for your own legal and compliance advisers; this article does not assess your obligations.

Why This Fails in the Real World: Common Failure Patterns

Key takeaway: Capable teams fail here because ownership is split across feature, platform, and vendor boundaries, and because ambiguity gets rounded to success or failure. The patterns below are illustrative composites, not client results.

Pattern 1: The retry that creates a second record

Illustrative scenario. A team builds a service that creates shipments in a carrier's system. It retries on timeout and passes every test, including a "retry succeeds" test. In production, a carrier response is lost after the shipment is created. The client library, following its default behavior, generates a fresh request identity for each attempt. The retry creates a second shipment. Both are billable.

Why did intelligent people miss it? The lifecycle of the identity belonged to no one. The feature team assumed the library handled it. The library authors assumed the caller supplied a stable key. The test double never dropped a response after commit, so the gap never appeared. This is a governance gap, not an individual mistake. Drill 3 would have found it in an afternoon, and the Stripe guidance on indeterminate outcomes states the same principle: do not retry with a new key until the original outcome has been resolved.

Pattern 2: The idempotency store that hides bugs or leaks across customers

Illustrative scenario. A multi-tenant platform stores idempotency records in a table keyed on the operation identity alone. Two tenants' systems generate sequential identifiers, and one day they collide. The second tenant receives the first tenant's stored response, which contains another customer's data. In a variant of the same weakness, a developer fixes a bug that changes the amount in a request but reuses the identity, and the system quietly returns the original result, so the fix appears to succeed while the corrected amount is never applied.

The causes are structural: no tenant dimension in the uniqueness rule, and no comparison of payload hash on reuse. Drills 2 and 8 test both directly. Notice that the privacy dimension and the correctness dimension are the same defect seen from two angles.

Pattern 3: Terminal failure that is really silent loss

Illustrative scenario. After five retries, failed events move to a dead-letter queue. The queue exists, so the design review passes. Nobody is paged, nobody owns triage, and the messages, which contain full customer payloads, are retained indefinitely. Months later, finance finds a reconciliation gap and discovers hundreds of unprocessed events. Separately, a security review finds that the queue is an uncontrolled copy of customer data.

The team believed it had handled terminal failure because a mechanism existed. A mechanism is not an outcome. Drill 9 requires an alert received by a named owner and a documented resolution path. The privacy control requires a retention rule for the same queue.

Why capable teams repeat these patterns

  1. Ownership is split. Behavior across the sender, the queue, the receiver, and the target has no single owner.
  2. Ambiguity is rounded. Timeouts become failures because failure is easier to report, or successes because the dashboard stays green.
  3. Environments are too polite. Staging has one worker, one tenant, no packet loss, and a mocked dependency.
  4. Incentives favor shipping. A feature that demonstrably works is easier to release than one with documented failure handling.
  5. Documentation is not read as a test source. Vendor pages that say "events may be delivered more than once" are treated as background rather than as test cases.

Risks, Constraints, and Trade-offs of Failure Testing

Key takeaway: Failure drills cost time, can create their own risk, and cannot reproduce every vendor behavior. State those limits plainly and make them part of the release decision.

Risk or constraintWhy it mattersPractical response
Drill effort competes with feature deliveryTen drills across many integrations is real work.Scope by consequence. Run the full set only on integrations that move money, inventory, entitlements, or regulated records. Use a reduced set for read-only or easily reversible flows.
Vendor sandboxes differ from productionA sandbox may not reproduce duplicate delivery, ordering behavior, or retention windows.Use a fault-injecting proxy you control to simulate the documented behavior. Label results as simulated, and confirm with the vendor where behavior is undocumented.
Testing in production has a blast radiusChaos-style experiments in live systems can cause the harm they aim to prevent.Start in pre-production. Limit production experiments to low-value, reversible operations with an agreed rollback and reconciliation path.
No target-side conditional mutationYou cannot get true compare-and-set from the target.Serialize per entity, accept lower throughput, and disclose the limitation. Test the serialization under concurrency.
Retention windows vs replay needsShort retention improves privacy but opens a gap where an old retry may be treated as new. Long retention increases exposure.Align retention with the sender's maximum retry horizon, and decide in advance what happens to deliveries older than the retained window.
Test data and privacyDrills that use production-like payloads create copies of sensitive data in test tooling.Use synthetic or masked data. Treat the test harness's stores as in scope for retention and access control.
False confidenceTen passed drills do not prove absence of defects.Record which drills were run, against which versions, and what was simulated. Do not describe the result as certification.

The trade-off nobody likes to price

Stricter controls slow some paths. Rejecting changed-payload reuse can break a client that legitimately retries with a corrected request, so your API needs a documented way to start a new operation. Serializing writes per entity limits throughput. Treating unknown outcomes as a distinct state creates operational work for the people who reconcile them. These costs are real, and they are almost always smaller than the cost of a consequential change that was applied twice or not at all. The decision for each integration is how much of that cost to pay, and the answer should be written down by someone accountable for the business process.

If your team lacks capacity for a harness, fault-injection proxy, and reconciliation tooling, it is more efficient to borrow them than to build one per project. That is one practical reason organizations bring in specialist integration consulting or testing automation support for the first few releases and then internalize the harness.

A Lower-Risk Path: Sequencing the Drills, Plus a 2026 Update

Key takeaway: Build the harness once, run it in CI, escalate to limited production only with reconciliation in place, and re-run on every change that affects delivery behavior.

A phased approach

PhaseActivityOwnerExit evidence
1. InventoryList every integration that creates, changes, or cancels something consequential. Classify by reversibility and value.Engineering lead with business process ownerSigned inventory with consequence tiers
2. Define identityFor each mutation, define the operation identity, who generates it, its tenant scope, and the approved payload that is hashed.ArchitectWritten identity contract
3. Build the harnessCreate a fault-injecting proxy and test fixtures for duplication, delay, reordering, dropped responses, and process kills.Quality engineeringHarness runs in CI against a pre-production environment
4. Run drills 1 to 10Execute against the integration, capturing evidence from the system of record.Quality engineering with service ownerEvidence package per control
5. Go/no-go reviewCheck every mandatory control. Document risk acceptances with an expiry date.Release ownerDecision record, including what was simulated
6. Limited productionRelease to a small, reversible slice with reconciliation jobs running and alerts routed to named owners.Service ownerReconciliation reports match expectations
7. MaintainRe-run affected drills when schemas, vendor API versions, retry settings, or retention rules change.Quality engineeringDrills in the regression suite

2026 Update: what has changed, and what has not

Two shifts make this discipline more relevant than before. First, more integrations are now triggered by automated workflows and AI agents that call tools and APIs on their own and retry when they get no answer. An agent that cannot tell whether a refund was issued is in exactly the position of the timed-out client in drill 3, and it is more likely to try again. Treat every tool an agent can call that changes state as a consequential mutation, and apply the same drills and controls. Second, vendor behavior is versioned. The Stripe documentation shows that idempotency retention and replay behavior differ between its API v1 (24 hours) and API v2 (30 days), so a drill result for one version should not be assumed for the other.

What has not changed is the underlying logic. Delivery is at-least-once, order is not guaranteed, responses get lost, and the only reliable answer to "did it happen?" is to ask the system that owns the truth. Specific vendor windows and APIs will change, so read the current documentation of each vendor before you rely on a figure in this article. The principles, the drills, and the mandatory controls are written so that they remain valid when the numbers move.

Do you know what your integration does when a response goes missing?

If the honest answer is "we think it retries safely," that is a hypothesis, not evidence. Test it before your customers do.

Talk to CIS engineers about failure drills, reconciliation design, and QA automation for your integrations.

Request Free Consultation

Conclusion: Five Decisions to Make Before the Next Integration Release

Integration failure testing is a decision discipline: it tells you which risks you have tested, which you have accepted, and who accepted them. Use the following actions as guidance for your next release review.

  1. Classify your integrations by consequence. Identify which ones create, change, or cancel something that is costly to reverse, and run the full ten-drill set on those first.
  2. Make the go/no-go list non-negotiable. Adopt the mandatory controls as required items with evidence. If one is missing, the outcome is no-go or a time-limited, signed risk acceptance, never a rounded-up score.
  3. Add an "unknown" state to your data model. Require reconciliation against authoritative state before any new attempt after an ambiguous timeout.
  4. Name owners for every store and queue. Idempotency records, replay stores, quarantine areas, and dead-letter queues each need an owner, a retention rule, and a minimized payload.
  5. Put the drills in regression. Re-run the relevant ones whenever a schema, a vendor API version, a retry setting, or a retention policy changes.

About Cyber Infrastructure (CIS)

Cyber Infrastructure (CIS) is an AI-enabled software development and IT services company founded in 2003, with 1000+ professionals and an in-house employee model, serving clients in the USA, EMEA, and Australia. CIS describes its delivery process maturity as CMMI Level 5-appraised, ISO 27001-certified, and SOC 2-aligned; request the current certificates and their scope when you assess any vendor, including us. Its teams work across enterprise integration, API governance, QA automation, and legacy modernization. Requirements that apply to your organization, including legal and regulatory obligations, remain yours to determine with your own advisers.

Reviewed by the CIS Expert Team.

Frequently Asked Questions

What is integration failure testing?

Integration failure testing is the deliberate injection of delivery faults, such as duplicate events, lost responses, crashes, reordering, and malformed input, into an integration before go-live. Each fault has a hypothesis and pass evidence taken from the authoritative system. It differs from functional testing, which confirms correct behavior when everything works.

Why not just rely on the vendor's idempotency keys?

Vendor keys help, but their scope is vendor-specific. In Stripe's documentation, for example, retention windows differ between API versions, and reuse of a key with different parameters returns an error. Your own services, queues, and other vendors may offer nothing similar. You still own the key lifecycle, tenant scoping, the behavior after the vendor's window closes, and the reconciliation of unknown outcomes.

What should we do after a timeout when we do not know whether the change was applied?

Mark the operation as unknown, not successful and not failed. Query the system that owns the truth to establish what happened. If an idempotency mechanism exists and its documented window allows, a retry with the same key and the same payload is the vendor-supported path. Do not generate a new key or a new request until the original outcome has been resolved.

Is a high test pass rate enough to approve a release?

No. A pass rate averages strong and weak areas together, so a missing control on a money-moving path can hide behind many passing tests. Use a list of required controls with evidence for each. Missing evidence means no-go or a documented, time-limited risk acceptance.

How do we avoid suppressing legitimate repeat operations as duplicates?

Do not derive identity solely from payload content. Let the originating workflow or user action supply an operation identity that represents intent, and bind a payload hash to it. A second, equal refund then has a new identity and proceeds, while a retry of the first refund shares its identity and is recognized. Drill 10 tests this explicitly.

Can we run these drills in production?

Prefer pre-production first, using a fault-injecting proxy to simulate documented vendor behavior. Limited production experiments can be valuable, in line with the published principles of chaos engineering, but only for low-value, reversible operations with reconciliation and rollback in place. Production drills on irreversible financial or regulated operations are rarely justified.

What if the target system has no conditional update or version check?

Reading, comparing, and then writing in your own code is not compare-and-swap, because another writer can intervene. Without target-side conditional mutation, serialize writes per entity, accept the throughput limit, and disclose it in the release record. Test the serialization under concurrent load.

Do idempotency keys and event logs count as personal data?

They can contain or reveal personal or commercially sensitive information, especially if a key is built from an email address or an identifier, or if a log stores full payloads. Whether specific laws apply to your stores depends on your jurisdiction and use case, so consult your legal and privacy advisers. As an engineering practice, minimize content, set retention, restrict access, and name an owner.

Is your next integration release backed by evidence, or by optimism?

Duplicates, lost responses, and silent failures rarely show up in a demo. They show up in a reconciliation report. CIS engineers can help you design the drills, build the harness, and set up the controls that make a go/no-go decision defensible.

Start with a free consultation on enterprise integration and APIs and QA automation.

Request Free Consultation
Related service

This article is most relevant for technology and digital-transformation leaders who need to roll out a practical technology solution. Use the related CISIN path to compare delivery options, implementation fit, risk, and practical next steps.

Explore related serviceRequest a free consultation
Editorial review

Reviewed for technology and business decision makers

This guide is reviewed for clarity, technical and operational relevance, service alignment, and a useful next step.

Review statusreviewed by the Experts team
SEO verificationVerified by the CIS SEO Team
Reviewed2026-10-30
FocusTesting-automation-service

Validate legal, security, data, budget, and operational requirements with the relevant stakeholders before rollout.