Skip to content
← All notes

AI agents generate thousands of tests. They cannot tell you which failures matter.

Test generation was never the expensive part of QA automation. The oracle problem has not moved, and agents make coverage a worse metric than it already was.

QA8 min read

Point a coding agent at a repository and ask for test coverage and you will get a lot of it, quickly, in the right framework, with sensible names and reasonable structure. That is real and it is useful.

It is also the part of test automation that was never the expensive part, and treating it as the win is how teams end up with a much larger suite and no more confidence than they started with.

What AI agents for automation testing actually do

A test-generating agent reads your source, infers what the code does, and writes assertions that describe it. Some also run the suite, read failures and iterate until things pass.

Read that sentence again, because the whole limitation is inside it. The agent derives its expectations from the implementation. It is describing what the code does, not what the code should do.

For code that is correct, that distinction does not matter and the tests are useful regression protection. For code that is wrong, the agent will faithfully assert the bug, the test will pass forever, and you now have a green tick sitting on top of a defect.

The oracle problem is why this is not a model capability gap

Software testing has a name for the hard part. The oracle problem: to decide whether a program behaved correctly, you need an independent source of truth about what correct means.

The reason this matters for agents is that the information is genuinely not in the input. Intended behaviour lives in a requirement document, a regulation, a support conversation, a decision somebody made in a meeting, or a user's unstated expectation that the total should never go negative. None of that is in the repository.

So this is not a limitation that a stronger model removes. You can improve reasoning as much as you like and it will not conjure a fact that was never supplied. The fix is to give the agent the oracle, which means the specification has to exist and be precise, and that is human work that most teams have not done.

Thousands of generated tests, all passing and interchangeable, and the separate question none of them answers: which of these failures is the one that actually matters.
Volume is cheap. Knowing which failure counts is not.

Where the cost of a test suite actually accumulates

Ask a team that has run a large suite for a few years where the effort went. Very few say writing the tests.

They say maintenance, flakiness, and deciding what a failure means. A suite of four thousand tests that reports ninety failures every morning is not a safety net, it is a queue. Somebody has to open each one and answer a question with no automated answer: real defect, intentional change that nobody updated the test for, or the suite being flaky again.

Get that call wrong twice in a fortnight and the team learns to ignore red, which leaves you worse off than having no suite at all, because now you are paying for one and still shipping blind.

Generation makes the numerator bigger and does nothing to the denominator. More tests, same triage capacity.

Where test automation agents genuinely earn their keep

Being clear about the limit makes the real wins easier to see. Agents are strong wherever the oracle already exists and the remaining work is mechanical:

  • Generating cases from acceptance criteria that are already written down. If somebody has specified the behaviour, turning that into thorough cases is fast, complete and dull, which is the ideal thing to delegate.
  • Porting a suite between frameworks or languages. The old suite is the oracle. The task is translation, which these tools do very well.
  • Triage assistance. Clustering ninety failures into four probable causes saves real time, as long as a person still decides what each cluster means.
  • Test data and fixtures. High volume, low judgement, and a common reason suites are thinner than the team would like.
  • Filling gaps around code that is already trusted and stable. Regression protection for behaviour you have deliberately decided is correct.

Why code coverage stopped being a useful metric

Coverage was always a weak proxy. It measures whether a line executed during a test run, not whether anybody thought about what that line should do.

It survived as a metric for a practical reason: writing tests was expensive enough that high coverage implied somebody had spent real effort thinking about the code. The number was standing in for the effort.

Remove the expense and the proxy collapses. Ninety percent coverage produced by an agent in an afternoon carries almost none of the information that ninety percent produced by a team over two quarters used to carry.

If you adopt agents for testing, change what you measure at the same time. Escaped defects, mean time to diagnose a red build, and the proportion of failures correctly triaged on first inspection all still mean something. Coverage does not.

A coverage figure climbing while the suite remains blind to the one behaviour that is wrong. Covering every line is not the same as checking the right thing, and generated tests widen the gap.
The number on the dashboard goes up either way.

The skill this makes more valuable, not less

The scarce ability here is not writing test code, which is precisely what got automated. It is knowing what the system is supposed to do, and being able to state that precisely enough to argue with a machine about it.

That is specification skill plus domain knowledge, and it is difficult to hire for because it does not show up in a portfolio. It shows up when somebody looks at a fully green suite and says the uncomfortable thing: this all passes and I still do not believe it.

It is also difficult to assess with a CV or a framework question, which is the same problem we ran into building assessments for engineering skills generally. What worked was giving people a real artefact with real problems in it and watching where they looked first.

Common questions

Can AI agents replace QA automation engineers?
They replace a portion of the writing, not the judgement. Agents are good at generating cases from an existing specification and at translating suites between frameworks. They cannot decide what correct behaviour is, because that information lives outside the codebase, and they cannot decide which of this morning's failures actually matters.
What is the oracle problem in software testing?
The oracle problem is that deciding whether software behaved correctly requires an independent source of truth about intended behaviour. An agent that infers expectations from the implementation has a circular oracle: it will assert whatever the code currently does, including its bugs, and the resulting test passes forever.
Is code coverage still a useful metric with AI-generated tests?
Much less so. Coverage was a proxy for effort, and it worked because writing tests was expensive. When a suite can be generated in an afternoon, a high coverage number no longer indicates that anybody reasoned about the behaviour. Escaped defects and triage accuracy are better signals.
How should a team introduce AI agents into their testing workflow?
Start where the oracle already exists. Generate cases from written acceptance criteria, port existing suites, and produce test data. Keep human ownership of what correct means, of triage decisions, and of exploratory testing. Change your metrics away from coverage before the volume rises rather than after.

PDP Quest exists because of the problem underneath all of these: when output stops indicating capability, you need another way to know who can actually do the work.

Keep reading

Three more notes on the same argument.