QA Horror Stories [Chapter 2]: Silence Of The Bugs

Testify
7 min readMay 22, 2024

--

Working in QA can be a double-edged sword: exhilarating when everything falls into place, but utterly dreadful when things go wrong. The thrill of finding and fixing issues can quickly turn into a nightmare when hidden bugs emerge unexpectedly. Every software tester has a story that sends chills down their spine, a project that turned into an unforeseen disaster. The moments when the system crashes, critical features fail, or data is corrupted are enough to make any tester shudder.

Welcome back to my series ‘QA Horror Stories,’ where I share some of the most frightening experiences from my career in software testing. Today, we delve into a tale where bugs remained silent until the end of the project, leading to catastrophic consequences. Prepare yourself for a story of overlooked details, hidden flaws, and the haunting realization that what lies beneath the surface can turn a peaceful project into a horror show…

Once Upon a Time, There Was a Project…

It all began with a new project for a financial software system. The team consisted of senior developers, an experienced project manager, and me as a QA engineer. From the outset, everything seemed meticulously planned. The initial meetings were detailed, timelines were set, and responsibilities were clearly assigned. There was a serene confidence among the team members, with everyone believing they had all bases covered.

The Calm Before the Storm

The development process began smoothly. I presented my test strategy and discussed the developers’ role in testing. The project manger emphasized trust in the developers’ skills and experience, assuring us that they would handle their part of the testing as well. Since they were senior developers, I briefly touched on unit tests and white box tests, suggesting they use whichever framework (TDD, BDD, etc.) they preferred and had used in the past. They agreed but didn’t clarify their specific approach. Not wanting to come across as a micromanaging QA manager, I didn’t press for their final decision, confident that everything would work out fine…

Lesson #1:

While trust in your team is crucial, it’s equally important to communicate clearly from the beginning. If something is unclear or not precisely defined, always double-check to ensure everyone understands the team’s approach.

When it comes to testing, I firmly believe that everyone on the team can and should contribute to enhancing quality. Typically, developers are responsible for unit tests and sometimes integration tests. However, always ask about their approach at the start and work to clarify any misunderstandings right away.

The Silence of the Bugs

Weeks turned into months, and the project was nearing completion. The developers had coded every feature, and I conducted testing along the way. Since it was a relatively small project and the developers were quite experienced, I didn’t spend excessive time on my part. I focused on testing all the tickets, primarily concentrating on the happy path — verifying that everything worked as described in the specifications, without checking all the alternative scenarios. There were some minor issues here and there, but overall, everything seemed peaceful and smooth.

However, this silence was misleading.

Since I had several projects going on at the time, I hadn’t had the opportunity to perform exploratory testing for this particular project. One Friday, I finally had some time and decided to delve deeper into the system. I started with the first module of the software and tried out some incorrect entries. And there it was — a small bug. Not major, but something that had been overlooked during development and perhaps not covered by the unit tests.

My curiosity was piqued, so I continued testing. I found another bug, and then another one. What was happening here? After two hours of exploratory testing, I had uncovered 13 bugs! And all of this on a Friday afternoon…

Lesson #2:

Often, we have a good feeling when testing software and everything seems fine during the development phase. However, if we don’t start testing the system thoroughly from the beginning, we might underestimate the potential for bugs. I should have tested the entire system more in-depth earlier, rather than waiting until I had enough time. Focusing solely on the defined specifications can lead to overlooking many different scenarios and mistakes. Each ticket in a project should be handled with the assumption that it could contain all the errors in the world.

The Dreadful Discovery

So, I did what any good QA engineer would do to boost their popularity — I wrote an email detailing my findings on a Friday afternoon and set up an emergency meeting for Monday morning.

On Monday morning, in a state of panic, we delved into the codebase, trying to identify the root causes of the issues. It became evident that many of the bugs stemmed from integration points between different modules, which had never been tested together until this final phase. The seamless individual tests masked the problems lurking in the integration. Dependencies between different components weren’t properly documented, leading to a cascade of failures when the system was assembled.

Additionally, it seemed that the unit tests had missed many “obvious” bugs. When I asked if the developers hadn’t tested these areas, I heard the horrific truth: “We didn’t write a lot of unit tests.” What!? “What do you mean by ‘not a lot’?” I asked. One developer admitted he had only written a few tests for certain parts. Another developer confessed that he hadn’t written any unit tests at all but assured me he would do it now. Great. No wonder the integration was so problematic — the individual parts hadn’t been tested correctly either, and the issues were there from the start. After examining all the software modules in more depth, we found many bugs that had been overlooked from the beginning.

Lesson #3:

Integration testing is as important as unit testing. Testing individual components in isolation is not enough; ensuring that these components work seamlessly together is critical to the success of the project. However, perhaps even more important than integrated testing is thoroughly testing each component individually. Unit tests should not only verify that a function performs as expected but also check if incorrect inputs can pass through the code. This wasn’t done in that project, and the truth was revealed at the end. The entire codebase was built on a weak foundation, causing everything to fall apart when it was tested all together at the end.

Back to the Haunting Grounds

The fallout was significant. Deadlines were missed, and the team morale plummeted. We had to embark on an intense bug-fixing spree, working around the clock to salvage the project. This experience, though painful, taught us invaluable lessons about the necessity of thorough and early testing.

When the developers fixed the code, I insisted that they show me the unit tests for their changes. This was when I discovered that one developer, despite being a senior, didn’t know how to write good unit tests. He believed that testing wasn’t important because he considered his code to be of high quality, so he didn’t see the need to learn it.

Lesson #4:

Never trust any developer… just kidding. The real lesson is that, as a tester and the person responsible for the QA process, you should always be aware of the quality of testing throughout the entire project. This means checking the unit tests, reviewing the integration tests, and discussing the testing approach with the developers. If I had been more meticulous, I would have asked a lot more questions at the beginning. But I made the mistake of assuming that a senior developer knows everything well, which isn’t true for any senior position. Always double-check if you are not sure.

Shatter the Silence

This experience underscored the importance of a proactive QA process. Bugs can remain silent, lurking beneath the surface, only to erupt when it’s almost too late. Continuous vigilance and testing are crucial. As a QA engineer, it’s essential to not only trust but also verify. Relying solely on the assurances of developers or the perceived stability of the code can lead to significant oversights.

Effective communication and collaboration within the team are key. Regular check-ins with developers about their testing approach, reviewing their unit tests, and understanding how integration tests are conducted can prevent many issues from slipping through the cracks. It’s also vital to ensure that every part of the system, no matter how minor it seems, is tested thoroughly both in isolation and as part of the larger system.

So, beware of the “silence” along a project. In the world of software development, it is never a good omen. It is the calm before a storm, the stillness before the eruption of bugs that can transform your project into a nightmarish horror story. Stay vigilant, test relentlessly, and never underestimate the lurking horror within the code.

If you’re interested in more content about Software Testing, QA, Artificial Intelligence and Digital Health, be sure to follow.

Website: https://www.therealtestify.com/

Twitter: https://twitter.com/TheRealTestify

Instagram: https://www.instagram.com/therealtestify/

YouTube: https://www.youtube.com/@therealtestify

--

--

Testify

Test Consultant / Senior Software Test Engineer 👨‍💻🕵️ 🐞🛠️ Passionate about Software Quality, AI and Digital Health