What to Do When Unit Tests Pass but Production Hates You

by Arif Ikhsanudin, Backend Developer

Everything works on your machine, all unit tests green.
Then production screams, and suddenly you’re the villain.

Green Tests ≠ Safe Deployment

Unit tests are a safety net, not a crystal ball.

  • They only cover the cases they were written for
  • They don’t see production’s real-world data quirks
  • They can’t predict environment-specific behavior

Passing tests make you confident, not invincible.

Step Back and Observe

When production fails, the first instinct is panic—but slow down.

  • Check logs first: errors are rarely subtle
  • Compare production input/output with what your tests used
  • Look for hidden assumptions in the code

Your job is investigation, not blame.

Isolate the Problem

Production failures are rarely caused by a single line of code.

  • Identify which service or module is misbehaving
  • Verify configuration differences between staging and production
  • Confirm dependencies, versions, and network behavior

Breaking it down avoids a frantic all-hands debugging session.

Communication Is Key

Once you know the problem, keep your team informed.

  • Send clear updates to managers and stakeholders
  • Document what fails, why, and what’s being tested next
  • Avoid speculation or panic—clarity helps everyone act faster

Unit tests may have passed, but transparency wins the day.

Lessons for the Future

Use the incident to strengthen your safety net:

  • Add integration or system tests for production-like scenarios
  • Review environment parity between local, staging, and production
  • Remember: tests are tools, not proof of perfection

Production will always throw curveballs—anticipate them, don’t fear them.

Scale Your Backend - Need an Experienced Backend Developer?

We provide backend engineers who join your team as contractors to help build, improve, and scale your backend systems.

We focus on clean backend design, clear documentation, and systems that remain reliable as products grow. Our goal is to strengthen your team and deliver backend systems that are easy to operate and maintain.

We work from our own development environments and support teams across US, EU, and APAC timezones. Our workflow emphasizes documentation and asynchronous collaboration to keep development efficient and focused.

  • Production Backend Experience. Experience building and maintaining backend systems, APIs, and databases used in production.
  • Scalable Architecture. Design backend systems that stay reliable as your product and traffic grow.
  • Contractor Friendly. Flexible engagement for short projects, long-term support, or extra help during releases.
  • Focus on Backend Reliability. Improve API performance, database stability, and overall backend reliability.
  • Documentation-Driven Development. Development guided by clear documentation so teams stay aligned and work efficiently.
  • Domain-Driven Design. Design backend systems around real business processes and product needs.

Tell us about your project

Our offices

  • Copenhagen
    1 Carlsberg Gate
    1260, København, Denmark
  • Magelang
    12 Jalan Bligo
    56485, Magelang, Indonesia

More articles

How I Manage My Energy as a Developer, Not Just My Time

Time management systems assume all hours are equal. They aren't — and once you start treating your energy as the scarce resource instead of your calendar, the way you work changes considerably.

Read more

Sorting in Java — Comparators, Natural Ordering, and Where Performance Actually Comes From

Java's sort is fast. The comparators passed to it often aren't. Here is how natural ordering, Comparator composition, and the contracts comparators must satisfy interact — and where subtle bugs hide.

Read more

Why Your System Is Slower Than Expected Even Under Normal Load

Slow systems under normal load are not a scaling problem — they are a design problem. The root causes are predictable and fixable, but only if you know where to look.

Read more

ActiveRecord Query Patterns That Actually Scale

ActiveRecord makes simple queries trivial and complex queries dangerous. These are the patterns that remain correct under load — and the common ones that quietly fall apart at scale.

Read more