Unit Testing Services | Coverage, Code Review & Support Skip to main content
QAonTOP
Contact Us

Unit Testing Services

The easiest bug to fix is one found in a single module, before it is tangled up with everything else.

Our QA engineers test each module and component by hand, on its own, as soon as it is ready. Where a check should run on every build, we help turn it into a coded unit test your developers can keep. You get problems found early, honest coverage and code that is safer to change.

  • Manual component testing
  • Coded tests where needed
  • 9 languages
  • Free one-week POC

[ Why unit testing ]

Find it in one module, not in the whole product

When a bug is found after everything has been put together, it can take hours just to work out where it came from. Testing each module on its own, as soon as it is ready, makes problems obvious and cheap to fix. Developers often don’t have time to do this carefully for every piece. Our QA engineers do it by hand, with a tester’s eye for edge cases, and help your team build coded unit tests where repeating a check automatically really pays off.

Languages: JavaScript and TypeScript, Java, Python, C# and .NET, PHP, Go, Kotlin, Swift and Ruby. Next step up: integration testing →

01

Bugs found while they’re small

Each component checked before it is joined to others, so problems are easy to trace and cheap to fix.

02

Clear on what’s tested

Manual checks and coded tests mapped to each module, with honest coverage.

03

Safer changes

Safety nets around risky code, so refactors and upgrades don’t surprise you.

04

Developers keep moving

QA takes on the careful, repetitive checking, so developers can focus on building.

[ What we test ]

Manual component testing first, coded unit tests where they pay off

Eleven services, starting with hands-on testing of each module. Each one lists what we do, when you need it and the problem it prevents.

Manual component testing

By hand, in isolation

Our QA engineers test each module or component on its own, before it is joined to the rest of the product, so problems are found while they are small and easy to trace.

What we test
  • Each module tested through its own screen, endpoint or test harness
  • Inputs, outputs, rules and calculations checked one by one
  • Boundary values, empty and invalid data
  • Stubs used so other modules don’t hide or cause failures
When you need it

As each module or feature is finished, before integration.

The problem it preventsBugs found weeks later, buried under three other modules

Unit test strategy & standards

Agreed rules

A short, practical agreement on what gets tested at unit level, by hand or in code, and what “good enough” looks like for your team.

What we test
  • What to test manually, what to code and what to skip
  • Naming, structure and review rules for unit tests
  • Sensible coverage targets per area, not one number for all
  • A checklist developers and testers can both use
When you need it

When starting a project, or when testing feels inconsistent.

The problem it preventsEvery developer testing differently, or not at all

Coverage analysis & gap filling

Know what’s untested

We measure what your current tests really cover, find the risky gaps and fill them first, by hand or with new tests.

What we test
  • Coverage reports read and explained in plain words
  • Untested business rules and error paths listed
  • Gaps ranked by risk, not by percentage
  • Gaps filled with manual checks or new unit tests
When you need it

Before a big release, refactor or audit.

The problem it preventsA high coverage number that hides untested critical code

Writing unit tests for existing code

Coded, when needed

Where a check should run on every build, our engineers turn it into a coded unit test that your developers can read and maintain.

What we test
  • Tests written in your language and framework
  • Clear names that explain the expected behaviour
  • Fast, independent tests with no hidden dependencies
  • Reviewed with your developers before merge
When you need it

For stable, high-risk code that changes often.

The problem it preventsThe same manual check repeated by hand every release

Test-driven development support

Tests first

For teams adopting TDD, we help write the first tests from the requirements, so developers build against clear, agreed behaviour.

What we test
  • Acceptance examples turned into unit-level cases
  • Edge cases suggested before code is written
  • Pairing sessions with developers
  • Gradual hand-over so the team owns the practice
When you need it

When a team wants to start or improve TDD.

The problem it preventsRequirements that are clear to nobody until the code is wrong

Mocking & test doubles

True isolation

Mocks, stubs and fakes that let a component be tested on its own, by hand or in code, without real databases, services or payments.

What we test
  • Stubbed services and sample responses for manual checks
  • Mocks and fakes in your unit test framework
  • Error, timeout and edge responses on demand
  • Mocks kept honest against the real behaviour
When you need it

Whenever a component depends on things that are slow, costly or unavailable.

The problem it preventsTests that fail because something else is down

Legacy code safety nets

Change without fear

Before older code is changed, we capture how it behaves today, so any change in behaviour is spotted straight away.

What we test
  • Current behaviour recorded with manual checks and characterisation tests
  • Risky areas mapped before refactoring
  • Safety net run after every change
  • Gradual improvement, not a big rewrite
When you need it

Before refactoring, upgrades or taking over an old codebase.

The problem it preventsA “small clean-up” that quietly changes business rules

Coded unit tests run automatically on every pull request, with coverage gates that stop untested changes from merging.

What we test
  • Unit tests running in GitHub Actions, Jenkins or your CI
  • Coverage reports with Codecov, JaCoCo or SonarQube
  • Gates on new code, so coverage never slips
  • Fast feedback, with flaky tests found and fixed
When you need it

Once you have a base of coded unit tests.

The problem it preventsUntested code merged because nobody noticed

Mutation testing

Test the tests

Mutation testing changes your code on purpose and checks whether your tests notice. It shows which tests really protect you.

What we test
  • Mutation runs with Stryker or PIT on key modules
  • Surviving mutants explained in plain words
  • Weak tests strengthened or replaced
  • Focused on critical code, not the whole codebase
When you need it

When coverage is high but bugs still get through.

The problem it preventsTests that run green no matter what the code does

Front-end component testing

UI building blocks

Buttons, forms and widgets tested on their own, by hand and in code, before they appear across your product.

What we test
  • Each component checked by hand in every state and variant
  • Props, events and edge cases
  • Coded component tests with Jest or Vitest
  • Changes checked for knock-on effects
When you need it

For component libraries and shared UI.

The problem it preventsOne broken component repeated on every screen

Unit test reviews & developer coaching

Better tests over time

We review your existing unit tests and help developers write clearer, more useful ones.

What we test
  • Review of test quality, naming and coverage
  • Missing cases and over-mocked tests flagged
  • Short, practical coaching sessions
  • Before-and-after examples from your own code
When you need it

When tests exist but nobody trusts them.

The problem it preventsA large test suite that slows the team down and still misses bugs

[ Manual component testing vs coded unit tests ]

Two ways to test a unit, and where integration begins

Manual testing finds problems; coded tests stop them coming back. Here is how they differ, and what a manual component checklist looks like.

Question it answersWho does itHow
Manual component testingDoes this module behave correctly on its own?QA engineers, by handEach module through its screen, endpoint or harness
Coded unit testsDoes this code still behave the same on every build?Developers and our engineersFunctions and classes, automatically
Integration testingDo the modules work together?QA and developersConnections between modules and systems
Sample component checklistManual, in isolation
Component
Discount calculator (checkout module)
Isolated by
Stubbed cart and price services
Checks
10% code on £100 → £90 · expired code rejected · two codes not combined
Edges
£0 cart · £0.01 item · code in lower case · 1,000 items
Expected
Totals rounded to 2 decimals; clear error for invalid codes
Result
Pass / Fail per check, with notes

Example only. Real checklists follow your modules and rules.

[ How we work ]

Six steps from first module to every build

We start by hand, prove value on real modules, then code only the checks worth repeating.

  1. Step 1 of 6

    Understand the code and risks

    Modules, business rules, current tests and coverage reviewed with your developers.

    You getModule and risk map
  2. Step 2 of 6

    Agree the approach

    What to test by hand, what to code, and sensible coverage targets per area.

    You getUnit test strategy
  3. Step 3 of 6

    Test components by hand

    Each module tested in isolation as it is finished, with stubs where needed.

    You getComponent test resultsBug reports
  4. Step 4 of 6

    Code what should repeat

    Stable, high-risk checks turned into unit tests in your framework.

    You getUnit tests in your repo
  5. Step 5 of 6

    Run on every build

    Unit tests and coverage gates in your CI.

    You getCI pipeline and coverage reports
  6. Step 6 of 6

    Review and improve

    Gaps, weak tests and flaky tests reviewed regularly.

    You getCoverage and quality summary
  • Free one-week POCWe test one important module by hand, review its tests and show you the gaps.
  • Your code, your rulesCoded tests follow your style, live in your repo and go through your reviews.
  • NDA before accessWe sign your NDA before we see any code.

[ Tools ]

The tools behind our unit testing

18 tools across four jobs, matched to your language and stack.

Unit test frameworks

In your language.

07 TOOLS
  • JestJavaScript and TypeScript
  • VitestVite projects
  • JUnitJava and Kotlin
  • TestNGJava
  • PytestPython
  • NUnit / xUnitC# and .NET
  • PHPUnitPHP

Mocks & isolation

Testing one piece at a time.

03 TOOLS
  • MockitoJava mocks
  • PostmanManual checks on one service
  • StorybookManual component checks

Coverage & quality

Knowing what is really tested.

04 TOOLS
  • SonarQubeCode quality and coverage
  • CodecovCoverage reports
  • JaCoCoJava coverage
  • Stryker / PITMutation testing

Pipeline & tracking

Every build, every result.

04 TOOLS
  • GitHub ActionsCI pipelines
  • JenkinsCI pipelines
  • JiraBugs and tasks
  • TestRailManual component cases

See every tool we use on our technology stack page →

[ Case Studies ]

Products our QA engineers have worked on

Each one links to the full write-up by the engineers who ran it. These show our wider QA work; unit testing was not the focus of these projects.

All case studies →

[ Ways to work ]

Six ways to get unit testing done

A tester checking modules as they are built, a coverage review, or help adding tests to old code.

Not sure which fits? Find your model in four questions or compare all six.

[ FAQ ]

Unit testing questions, answered

{{ f.a }}

[ Contact us ]

Get a unit testing plan for your codebase

✓ Free one-week POC✓ NDA before access✓ A QA lead replies the same day

[ Keep exploring ]

Other testing services

All services →