Skip to content
All posts
February 11, 20264 min read

Testing Without a QA Team: How Developers Can Own Quality

Most small teams and solo developers don't have a dedicated QA engineer. That doesn't mean quality is optional — it means developers must cover the QA function. Here's how to do it without making it a full-time job.

TestingSolo DevBest Practices
Share:

The absence of a QA engineer doesn't mean the absence of quality. It means the responsibility shifts to developers. Pretending it doesn't shift — shipping without any structured testing — is how bugs become production incidents.

Here's how developers can cover the QA function without burning out.


Why Self-Testing Is Hard

You can't effectively test your own code in the same session you wrote it. Your mental model matches the implementation. You test the paths you coded, not the paths you forgot to handle.

Two strategies to overcome this:

Time delay: Finish writing the code. Work on something else. Come back and test with fresh eyes. Even a few hours helps.

Context switch: After development, deliberately switch from "author" to "tester" mode. Close the code editor. Open the app. Be the user, not the developer.


The Developer QA Checklist

Before marking any feature as done:

Functionality

  • Happy path works as specified
  • Empty state is handled (what happens with no data?)
  • Error state is handled (what happens when it fails?)
  • Data persists correctly after closing and reopening the app

Input validation

  • Empty inputs are handled
  • Maximum length inputs are handled
  • Invalid format inputs show appropriate error messages
  • Special characters don't break anything

Navigation

  • Back button works correctly from every screen
  • Deep links navigate to the correct screen
  • Navigation state survives rotation

Lifecycle

  • App survives a phone call (pause/resume)
  • Data isn't lost on rotation
  • App behaves correctly after being backgrounded and resumed

Edge cases

  • What happens with no network connection?
  • What happens when the server returns an error?
  • What happens with the user's data in an unexpected state?

Automate the Repetitive Checks

Some of the checklist above can be automated:

  • Empty/invalid input validation → unit tests
  • Data persistence → Room integration tests
  • API error handling → mock server tests
  • Navigation → Compose UI tests for critical flows

The goal is to automate checks that you'd otherwise run manually before every release. Once automated, they run in CI on every commit.


Leverage Peer Review for QA

Code review by a colleague is an underutilized QA step. When reviewing, the reviewer should:

  1. Mentally trace the code for the happy path
  2. Ask: what happens if this parameter is null?
  3. Ask: what happens if this network call fails?
  4. Check error handling in catch blocks
  5. Verify user-facing error messages are helpful

Most reviewers check code style and correctness. The QA review checks for handled failure cases.


Bug Bash Sessions

A bug bash is a time-boxed session where the team (or just you, as a solo developer) focuses entirely on finding bugs:

  • No feature development during a bug bash
  • Everyone installs the latest build and tries to break it
  • Focus on areas that changed in this release
  • Try unexpected user paths
  • Try the app on different devices/OS versions

A 2-hour bug bash before a major release catches things that automated tests and developer self-testing miss.


When to Use Beta Testing

A small group of real users catches bugs that internal testing misses:

  • Users have different devices, OS versions, and usage patterns
  • Users have different mental models — they do unexpected things
  • Users in different regions may expose localization issues
  • Users with actual usage history expose data migration issues

Set up a closed beta on Play Store (up to 100 testers, no public visibility). Recruit from your user base via email or in-app prompt. Send beta builds before every major release.


The Minimum Viable QA for a Solo Developer

What's achievable and provides real protection:

  1. CI with automated tests — catches regressions automatically
  2. Developer checklist review — 30 minutes per feature before marking done
  3. Release build testing on a real device — always test the signed release build, not debug
  4. Staged rollout — 10% → 50% → 100% with monitoring at each stage

This isn't comprehensive QA. It's proportionate QA for a one-person team. It won't catch everything, but it catches the important things before they become production incidents.


When to Hire a QA Engineer

If any of these apply, consider bringing in QA help:

  • Crash rate is consistently above 1%
  • User reviews regularly cite bugs
  • You're spending more time on bug fixes than features
  • You have more than 5 active apps to maintain
  • A major release would benefit from structured testing

Part-time QA contractors are available and can provide significant value per hour for release testing.


Takeaways

  • Developer self-testing is hard because of mental model bias — use time delay and mode switching
  • A structured checklist covers the cases that ad-hoc testing misses
  • Automate the repetitive checks so CI catches regressions without manual effort
  • Code review with a QA lens (what happens when this fails?) is underutilized
  • Staged rollout is a safety net — even without QA, it limits production exposure of new bugs
Share:
S

Sudarshan Chaudhari

AI Systems Builder / Product Engineer

Bangkok, Thailand

Solo Android developer with 13+ years in QA, building Android apps, AI automation systems, and developer tools at SudarshanTechLabs.

Stay updated

Get new posts on Android, Kotlin, and solo dev straight to your inbox.

Newsletter preferences

Building something? Available for Android dev and QA consulting.

Work with me

Comments — powered by Giscus