Omegaswift
Solutions

QA & Testing

Most teams do not need more tests, they need a suite they trust. We work out what is worth automating, fix the tests that fail at random, and put people where people are genuinely better.

How We Help

What qa & testing looks like as a piece of work.

Your Pyramid Is Upside Down

The classic drawing has a wide base of unit tests, a narrower band of integration tests, and a few end to end journeys at the top. Most suites we inherit are the other way up: a hundred browser tests driving the whole stack, almost nothing underneath, and a build that takes forty minutes to tell you a date was formatted wrong. The browser tests are not wrong in themselves, there are simply far too many of them, because each one is slow, each one can fail for six unrelated reasons, and each one needs the entire system running to say anything at all. The fix is not deleting them. It is pushing every check down to the cheapest level that still catches the defect, and reserving the browser for the handful of journeys that genuinely need a browser.

A Flaky Test Is Worse Than No Test

A test that fails one run in twenty teaches your team to press retry, and once that habit forms the suite has stopped being a signal. Nobody reads a red result any more, and the one genuine failure that month goes out to customers inside the noise. So we treat flakiness as a defect with a priority rather than as weather. The causes are dull and fixable: a hard coded wait instead of waiting on a condition, two tests sharing a database row while running in parallel, an assertion on a list whose order was never guaranteed, a clock that behaves differently after midnight. The rule we work to is that anything flaky leaves the blocking suite the same day, and is then fixed within the week or deleted. Deleting it is an honest outcome. Keeping it is not.

Test Data Is The Hard Part

Everybody expects the difficulty to sit in writing assertions. It almost never does. It sits in getting an account into the exact state a test needs: a customer three months into a subscription, an order that has been part refunded, a user whose trial expired yesterday, a warehouse with one item left. Teams solve this by cloning production, which works right up until an automated test emails a real person or a laptop holding a full customer table goes missing. The workable answer is usually builders in code that create what a test needs and remove it afterwards, a small masked extract for the cases too expensive to construct, and a seeded set of edge cases everybody agrees never changes. It is unglamorous, and it decides whether the suite can be run by anyone or only by the person who wrote it.

Coverage Is A Number, Not An Answer

Line coverage tells you which lines were executed while the tests ran. It does not tell you whether anything was checked, because a test with no assertions in it still counts every line it touched. We have read ninety per cent on a codebase where the payment path had a single test, and that test asserted the function returned without throwing. What is worth measuring sits at the other end: how many defects reached customers, how long each one survived before something caught it, and whether the same bug has now come back twice. Coverage stays useful in one narrow way, as a means of finding files nobody has ever tested, and a floor stops the number sliding quarter by quarter. A target of ninety five per cent mostly buys you tests written to raise a number.

A Gate At The End Finds It Too Late

QA as a stage at the end of the calendar produces the same week every release: a queue of finished features, two days of tapping through them, a list of defects raised against work whose author has moved on, and a meeting about which ones you ship anyway. Every one of those defects was created weeks earlier, at a point where it would have cost an hour. So the tester belongs in the conversation before the code exists, asking what happens when the file is empty, when the card is declined twice, when two people edit the same record at once. That question at refinement is worth more than a fortnight of testing afterwards. It does not mean nobody looks at the finished thing. It means the finished thing is not the first time anyone considered how it breaks.

What we build

The shapes qa & testing work actually takes

  • Test strategy

    Two pages saying what is automated, what stays manual, and what is deliberately not tested at all, so the third one is a decision somebody made rather than an accident.

  • Automated regression

    The checks that run on every merge, weighted towards unit and API level, with browser journeys kept to the few that genuinely need a browser to mean anything.

  • Exploratory testing

    A person who knows the domain trying to break it, timeboxed and with notes. Finds the defects nobody thought to write a test for, which is most of the interesting ones.

  • Device and browser coverage

    Real handsets and real browsers picked from your analytics, including the mid range Android two OS versions behind that a quarter of your users are actually on.

  • Performance and load

    Run against a figure agreed beforehand. A report saying the system got slower under load, without saying slower than what, is not a result anybody can act on.

  • Accessibility testing

    Automated checks catch roughly a third of it. The rest is keyboard paths, focus order and a screen reader, driven by somebody who has genuinely used one.

How we work

How a qa & testing engagement runs

  1. 01

    Read the escaped defects

    Six months of bugs that reached customers, sorted by where they should have been caught. That list, rather than a coverage report, is what a test strategy should be built around.

  2. 02

    Write the strategy down

    Which layer checks what, what stays manual, what is knowingly untested. Its main job is stopping every new test defaulting to a full browser test because that is what the last one was.

  3. 03

    Fix the data first

    Builders that create an account in the state a test needs and tear it down after. Until this exists every suite is fragile, and only the person who wrote it can run it.

  4. 04

    Rebalance the suite

    Push checks down to the cheapest level that still catches the defect, quarantine anything flaky, delete tests that assert nothing. The suite gets smaller and more useful at the same time.

  5. 05

    Move testing earlier

    A tester in refinement asking what happens when it is empty, declined or edited twice. The cheapest defect is the one argued out of the ticket before anybody writes the code.

Who it is for

You probably need this if

  • The same bug came back

    A defect you already paid to fix returned two releases later. That is not bad luck, it is a missing regression test on a path you already know matters.

  • Everybody re-runs the build

    Red means retry rather than stop. The suite still runs on every merge, but it stopped carrying information months ago and nobody wants to say so out loud.

  • Release week is three days of tapping

    The same manual pass every time, done by people who have learned which parts are boring and skip them, which is reliably where the defects are living.

  • You test on the phones on your desks

    Which are newer and faster than the ones your customers hold. Your crash reports already disagree with your test lab, and the crash reports are right.

FAQ

Questions we get asked

We have no automated tests at all. Where do we start?

Not with a plan to cover the codebase, because that never finishes and the first three months produce nothing anybody notices. Start with the paths where a defect costs money: checkout, login, whatever your invoices depend on. Write those at the API level, where they run in seconds and rarely break for cosmetic reasons. Then add a test with every bug fix, so the suite grows along the lines your product actually fails on rather than along the shape of the file tree. Two months in you have a small suite that catches real things, which is worth considerably more than a large one nobody believes. It also means the first thing your team sees is a bug that did not escape, rather than a chart.

Should we automate everything and stop testing by hand?

No, and teams that try it tend to end up with an expensive suite and worse quality. Automation is for checks that are known, repeatable and boring, which is exactly what a person does badly on the fortieth run. It cannot tell you that a screen is confusing, that an error message blames the user for something the system did, or that a flow which reads fine on paper is impossible in a shop with one hand full. That is exploratory testing, it is a skilled job, and it works best timeboxed with written notes rather than as an unstructured click around. A one off migration check is usually cheaper done by hand than automated, and we will say so rather than bill you for the script.

Do we need real devices, or will emulators do?

Emulators are fine for most of the day and wrong at the moments that matter. What they do not reproduce is the manufacturer layer sitting on top of Android, aggressive battery management killing your background work, a camera or fingerprint sensor behaving differently, slow storage, or how the app feels on a two year old mid range handset with fifty other apps installed. So development runs on emulators, and anything touching hardware, permissions, notifications or performance gets confirmed on real devices chosen from your analytics rather than from a wish list. A device cloud covers the long tail cheaply. Two or three physical handsets on a desk cover the models you ship to most, and those are the ones worth owning.

Our regression suite takes four hours. What do we do about it?

Do not start by buying more parallel runners. That hides the problem and doubles the bill, and you still cannot tell anyone what the suite is for. Look at what the four hours is made of first. It is usually a large number of full stack browser tests, many checking a rule a unit test could confirm in milliseconds, plus a group that share an environment and therefore cannot safely run at the same time. Push checks down a layer, split the suite so a fast subset runs on every push and the full one runs nightly, and delete anything that has not failed for a real reason in a year. Parallelism afterwards, once the suite deserves the hardware.

Can we just use a copy of the production database for testing?

It is the quickest answer and it creates two problems you meet later. The first is legal: a full copy on a laptop, or in a staging environment with weaker access control, is a breach waiting for an audit, and under most privacy regimes testing is not a defensible reason to be holding it. The second is practical: real data drifts, so a test that depends on customer 4471 being mid subscription fails the morning that customer cancels. We prefer builders in code that create the state a test needs, plus a masked extract where a case is genuinely too expensive to construct. Masked properly, meaning unrecoverable, not shifted by a few characters and called anonymised.

Do we need load testing, and when is it a waste of money?

You need it when there is a date, a number and a consequence: a campaign, a ticket release, a payroll run, a partner integration with a contractual response time. Then the work is real, because you are testing against a figure somebody has agreed to rather than against curiosity. It is a waste when nobody can tell you what good looks like, because the report will say the system slowed down under load and everybody will nod. It is close to useless against an environment a quarter the size of production holding an empty database, which is the most common way it actually gets done. Sizing and data volume decide whether the numbers mean anything, and both cost money to get right.

How much of accessibility can actually be tested automatically?

Roughly a third, and that third is worth having because it is cheap and it runs on every merge: missing labels, contrast failures, images with no alternative text, form fields with no association to their label. What automation cannot judge is whether the alternative text says anything useful, whether focus order matches the visual order, whether a custom component announces its state when it changes, or whether a task can be completed with a keyboard alone. Those need a person, a keyboard and a screen reader they know how to drive. We run the automated layer in the pipeline and the manual layer per release on the flows that matter, and we tell you which findings are legal exposure and which are simply poor.

How will we know the testing is actually working?

Not from the number of tests, which only ever goes up, and not from coverage. The measures worth reporting are how many defects reached customers this quarter against last, how long each one survived before something caught it, how often the same bug came back, and whether your team has stopped re-running failed builds out of reflex. Release frequency is a good indirect signal as well, because teams release rarely when releasing frightens them, and a suite people believe is most of what makes it dull again. We agree those numbers at the start and put them in front of you monthly, including the months when they did not move.

What you get

What is different once the qa & testing work is done

  • A regression suite that runs in minutes and that people believe
  • Flaky tests quarantined the same day, then fixed or deleted
  • Real handsets and real browsers, chosen from your analytics
  • Test data your team can create on demand, without a copy of production

Ready to talk about your IT?

We are happy to answer any questions you have and help you work out which of our services fit your needs.