Hero Background

Next-Gen App & Browser Testing Cloud

Trusted by 2 Mn+ QAs & Devs to accelerate their release cycles

Next-Gen App & Browser Testing Cloud
AI TestingAI

Model Evaluation for QA Engineers: ML Metrics in QA Terms

The vocabulary an ML team uses for the activity you already call testing, mapped term by term, with the places the mapping breaks.

Author

Anubhav Singhmaar

Author

Author

Sandeep Yadav

Reviewer

Published on: August 31, 2026

Model evaluation is the measurement of how well a trained model performs on labelled data it was never trained on, reported as scores between 0 and 1 instead of a pass or fail. It is the same activity QA calls testing, with different names for the pieces and an aggregate score where an assertion would be. Sign-off arrives as a number, not a red or green build.

Public scores move fast and say little about your workload. Stanford HAI's 2026 AI Index technical performance chapter reports that frontier models gained 30 percentage points in a single year on Humanity's Last Exam, a benchmark built to be hard for AI, which still tells you nothing about whether your agent handles your customers' billing questions. This article maps each ML evaluation term onto the testing term you already use, then marks the places where the mapping stops holding and costs teams a release.

TL;DR

Model evaluation scores a trained model against labelled examples it has never seen, producing metrics such as precision, recall and F1 in place of a pass or fail. A human then sets the threshold that turns one of those scores into a release decision. QA test-design skills transfer directly; the vocabulary and the assertion style do not.

The Four Terms That Trip QA Engineers Up

  • Test set: A collection of labelled input and output pairs used to compute one aggregate score, not a collection of independent assertions. A single wrong prediction lowers a number instead of failing the run.
  • Recall: The share of real positives the model actually caught, defined by scikit-learn as tp divided by tp plus fn. This is the metric that catches an agent silently skipping the escalations it should have raised.
  • Threshold: The number a human chooses to convert a score into a release decision. Model evaluation supplies no threshold of its own, which is why an unowned evaluation never blocks anything.
  • Regression: A drop in an aggregate metric between two model versions, not a previously passing assertion that now fails. Comparing output strings across versions produces noise rather than signal.

Where Does This Run?

Built-in pass or fail: No. Evaluation returns a score and a human sets the threshold. CI integration: Yes. TestMu AI's Agent Testing scores chat and voice agents on nine quality dimensions including hallucination and context awareness, and its CLI emits JUnit XML so a CI job gates on the exit code.

What Is Model Evaluation?

The mechanics are four steps. Hold back labelled examples the model never saw in training, run the model across them, compare each output to its label, and compute scores from the counts of right and wrong answers.

None of that is foreign to QA. The output shape is. A test run answers "did this break?" and model evaluation answers "how often, and in which direction, is this wrong?"

Standards bodies treat both as one discipline. The NIST AI Risk Management Framework defines its MEASURE function as putting in place "objective, repeatable, or scalable test, evaluation, verification, and validation (TEVV) processes including metrics, methods, and methodologies". Test and evaluation sit in the same acronym for a reason.

NIST also states that measurement processes "should include rigorous software testing and performance assessment methodologies with associated measures of uncertainty, comparisons to performance benchmarks, and formalized reporting and documentation of results". Rigorous software testing is the phrase in that sentence a QA engineer owns.

Capgemini's World Quality Report 2025 found that 50% of respondents report their organizations lack AI/ML expertise, unchanged from 2024. Not all of that gap needs years of retraining to close. A large part of it is vocabulary.

ML Evaluation Terms in QA Language

Each row below pairs an ML term with the testing concept it most resembles, then names the place the two stop being the same thing. The third column is the important one: it is where teams get burned assuming the analogy holds.

ML termClosest QA conceptWhere the analogy breaks
Test setTest suiteA suite fails when one case fails. A test set produces one aggregate score, so a wrong answer moves a number instead of failing the run.
Ground truth labelExpected resultExpected results are written by the test author. Labels are often written by a different team, and disagreement between labellers is a real source of score noise.
InferenceTest executionExecution is deterministic given the same build and input. Inference on a generative model is not, so two identical runs can produce two different scores.
Held-out / validation splitTest data isolated from fixturesFixture reuse is a tidiness issue. Reusing evaluation data during training is data leakage, and it inflates every score in the report.
ThresholdAssertionAn assertion ships with the test. A threshold is a separate human decision, and evaluation frameworks do not supply one for you.
Regression (metric drop)Regression failureA regression failure names the broken case. A metric drop names nothing, so triage means diffing per-example results between two runs.
BenchmarkSmoke suiteA smoke suite covers your product. A public benchmark covers someone else's task, and models are frequently tuned against it.
LLM-as-judgeAutomated oracleAn oracle is trusted by construction. A judge model is itself a model under evaluation, so it needs its own agreement check against human labels.
DriftFlaky testFlakiness is noise you suppress. Drift is signal that the world changed, and suppressing it hides a real production regression.

Two rows deserve extra attention. The threshold row explains why evaluation work stalls: nobody owns the number. The LLM-as-judge row explains why evaluation results are sometimes wrong with no visible symptom, and it is the row that most often surprises teams migrating from testing AI applications by hand.

Why Does Model Evaluation Have No Pass or Fail?

A functional test encodes its own verdict. An assertEquals(200, response.status) call carries the standard inside the assertion, so the test tells you whether it passed.

Model evaluation returns 0.72. Nothing in the number says whether 0.72 ships. Somebody has to decide, and that decision is a product decision informed by what each kind of error costs.

Here is a real run. The script below scored a 28-case evaluation set for a support agent, where the positive class is "should escalate to a human", using the formulas in the next section. This is the actual console output:

$ node score-eval-set.mjs
cases scored      : 28
confusion matrix  : tp=9 fp=4 fn=3 tn=12
accuracy          : 0.750
precision         : 0.692
recall            : 0.750
f1                : 0.720
gate recall>=0.90 : FAIL
missed escalations: ESC-03, ESC-06, ESC-10
$ echo $?
1

Accuracy of 0.750 reads as tolerable. Recall of 0.750 means three of the twelve cases that needed a human never got one, and the report names them: ESC-03, ESC-06 and ESC-10. Same run, same data, opposite conclusions depending on which number the team agreed to read.

The practical move is to write the threshold down before the run, next to the reason. Three sentences are enough:

  • Name the positive class and say which error costs more. Here, a missed escalation costs more than an unnecessary one.
  • Pick the metric that punishes that error. A missed positive lowers recall, so recall is the gate.
  • Set the number and the owner. Recall at or above 0.90, owned by the support quality lead, reviewed every quarter.

TestMu AI's Agent Testing platform makes this explicit rather than tribal. It scores chat and voice agents across nine quality dimensions including hallucination detection, bias detection, completeness, context awareness and root-cause understanding, then lets you set a minimum acceptable score per metric and configure whether higher or lower is better for each one. The threshold stops being a number in somebody's head.

Named threshold configurations matter more than they look. A "Strict" config for a healthcare flow and a "Default" config for a marketing FAQ bot let one team run one evaluation set at two standards, which is the thing a shared global threshold cannot do.

Automate web and mobile tests with KaneAI by TestMu AI

The Metrics You Will Actually Be Handed

Most metrics come from four counts. True positives and true negatives are correct answers; false positives are false alarms; false negatives are misses. The scikit-learn precision_score reference defines precision as the ratio tp / (tp + fp), and its companion recall_score as tp / (tp + fn).

F1 is the balanced combination of the two, the special case of the F-beta measure where beta equals 1 and precision and recall are weighted equally. Read the table by the last column, which names the failure each metric conceals.

MetricThe QA question it answersThe failure it hides
AccuracyHow often is the model right overall?Rare but expensive cases. A model that never escalates still scores well when only 5% of traffic needs escalation.
PrecisionWhen it raises a flag, how often is the flag real?Everything the model stayed quiet about. A model that flags one obvious case and nothing else scores 1.00.
RecallOf the cases that mattered, how many did it catch?Alert volume. A model that flags every single case scores 1.00 and buries the support queue.
F1Is the precision and recall trade-off balanced?Which side is weak. F1 of 0.72 could be precision 0.69 and recall 0.75, or the reverse, with very different consequences.
AUC-ROCDoes the model rank risky cases above safe ones?Performance at the threshold you actually ship. AUC summarises every threshold, including ones you will never use.
MAE and RMSEFor numeric predictions, how far off is it on average?Outliers, in the MAE case. RMSE punishes large errors harder, so a gap between the two flags a few very bad predictions.

Generative systems add metrics that have no confusion matrix behind them, because the output is text rather than a class. Hallucination rate, completeness and context awareness are scored by a judge, human or model, against the source material. Those are the dimensions the Agent Testing metrics documentation details for chat, voice, phone and image agents.

A judged metric carries a second model's error on top of the first model's. Treat the judge as a component under test: sample its verdicts, have a human relabel that sample, and track the agreement between them as its own number on the report.

How to Build an Evaluation Set Like a Test Suite

Test design skills transfer directly here. Equivalence partitioning, boundary analysis and negative testing are exactly how you decide which examples belong in an evaluation set.

What changes is proportion. A test suite covers each partition once because one case proves the branch works. An evaluation set needs enough examples per partition for the score to mean something, since a partition with three examples produces a metric that swings by a third when one prediction changes.

  • Partition by user intent, not by feature - group the set the way a user arrives, so "refund request", "plan change" and "outage report" each get their own score alongside the headline number.
  • Size each partition for stability - a partition where one flipped prediction moves the metric more than the margin you gate on is too small to make a release decision from.
  • Label the boundary cases first - the ambiguous examples are where model versions actually differ, and a set made only of clear cases scores high on every version and distinguishes nothing.
  • Keep adversarial phrasing in the set - angry, terse and misspelled inputs belong in the evaluation data, because an agent that handles polished phrasing is not the same as an agent that handles users.
  • Freeze a subset permanently - a locked group of examples that must never regress gives you a stable reference across model versions, in the way a smoke suite does across builds.
  • Record who labelled each example - when two labellers disagree, the argument is about the label, not the model, and you can only see that if labeller identity is stored.

Leakage is the one failure mode with no QA equivalent. If an example in the evaluation set also appeared in training data, the model has seen the answer, and every metric computed on it is inflated. Version the evaluation set separately from training data and keep the split reproducible.

Note

Note: TestMu AI's Agent Testing generates evaluation scenarios directly from an uploaded PRD or requirements document, then runs them across personas and adversarial inputs so the set covers phrasing a hand-written suite misses. Start evaluating your agent free.

Running Evaluation in CI and Gating the Release

Evaluation is a pipeline job like any other. It scores a held-out set, compares each metric to its threshold, and exits non-zero when a threshold is breached, which is the contract every CI platform already understands.

The scoring script from earlier already follows that contract: it returned exit code 1 when recall fell below 0.90. A hosted evaluation follows the same shape, and wiring one into GitHub Actions needs no plugin.

name: Agent Evaluation

on: [push]

jobs:
  evaluate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install the TestMu AI agent testing CLI
        run: pip install testmu-a2a-cli

      - name: Score the held-out evaluation set
        env:
          TESTMU_USERNAME: ${{ secrets.TESTMU_USERNAME }}
          TESTMU_ACCESS_KEY: ${{ secrets.TESTMU_ACCESS_KEY }}
        run: testmu-a2a run --format junit --output results.xml

      - name: Publish the run as a build artifact
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: evaluation-results
          path: results.xml

This behaves like the rest of your suite for concrete reasons. Authentication comes from environment variables rather than an interactive login, JUnit XML is read natively by GitHub Actions, GitLab CI, Jenkins and CircleCI, and exit code 0 or 1 wires straight to pipeline pass or fail.

Keep the results file as an artifact on every run, including failures. A metric drop tells you nothing on its own, so the per-example results from the previous run are what turn "recall fell 4 points" into a list of examples to look at.

The pattern that holds up uses two gates. A blocking gate on the metric tied to the expensive error, and a reporting-only gate on the rest, so a 2-point wobble in a secondary dimension does not train the team to ignore red builds. Aggregated trends across those runs are what test intelligence dashboards are for.

Next-generation test execution with TestMu AI

Regression Testing a Model That Is Not Deterministic

Regression testing assumes a stable baseline. Run the suite on the old build, run it on the new one, and any case that flips from green to red is the regression.

Generative models break that assumption at the first step, because the same prompt produces different text on two consecutive calls. Diffing the strings produces a wall of differences with no defects in it, which is the trap teams fall into when they first apply testing techniques for non-deterministic AI outputs to a model upgrade.

Score behaviour instead of text. Everything below rests on comparing distributions rather than individual outputs:

  • Compare distributions, not strings - run the same evaluation set against both versions and compare the aggregate metrics, treating a drop beyond an agreed margin as the regression signal.
  • Set the margin from observed variance - run the current model against the set several times first, and set the margin wider than the spread you measure, otherwise run-to-run noise fails builds on its own.
  • Segment before you conclude - a flat headline metric routinely hides one partition getting better while another gets worse, so compare per-partition scores before signing off a version.
  • Guard the frozen subset absolutely - the locked examples get a zero-tolerance gate, which gives you at least one check with the binary behaviour a regression suite is supposed to have.

Model upgrades are the moment this pays. A provider version bump can raise the headline score and still break the one intent your highest-value customers use, and only per-partition comparison shows it. TestMu AI's Agent Testing runs this comparison as scheduled regression coverage after model updates, alongside pre-launch validation, so the check happens on a cron rather than when somebody remembers.

Public benchmark scores are not a substitute for this. A benchmark measures someone else's task on data your users never send, so a model that climbs it can still regress on the single intent your revenue depends on. Deeper treatments of the judged-metric side live in our guides to LLM evaluation and RAG testing.

Conclusion

Start by writing down one threshold. Pick the model your team already ships, name the error that costs the most, choose the metric that punishes it, and put a number and an owner next to it before the next evaluation run. That single artifact converts a score nobody acts on into a gate.

Then move the run into the pipeline where the rest of your suite lives, keep the per-example results as artifacts, and gate on the one metric that matters rather than all of them. The translation work is most of the job, and the QA skills underneath it already transfer.

To score a live agent against these dimensions, the Agent Testing platform covers chat, voice, phone and image agents with per-metric thresholds and CI-ready output, and the testing your first AI agent guide walks through the first run end to end. If you are also evaluating tooling, our roundup of AI agent evaluation tools compares the options.

Author

...

Anubhav Singhmaar

Blogs: 15

  • Linkedin

Anubhav Singhmaar is an AI Product Manager at TestMu AI driving Kane CLI, the command-line tool that brings browser automation to the terminal, turning natural-language flows into runs in a real Chrome browser that return pass or fail with shareable proof. He owns the roadmap and prioritization and works with engineering to ship developer-facing features. Before TestMu AI, he spent over four years at Sprinklr owning enterprise voice AI across APAC and EMEA. A mechanical engineer turned product manager, he grounds guidance in real QA workflows.

Reviewer

...

Sandeep Yadav

Reviewer

  • Linkedin

Sandeep Yadav is a Senior Software Engineer at TestMu AI (formerly LambdaTest), where he builds the platform's test intelligence and AI-native engineering systems. He has architected autonomous GitHub Apps, vector-search code intelligence, and self-diagnosing QA workflows, and designed distributed platforms that process 2M+ daily test executions and 1B+ events, turning high-volume test, log, and code data into intelligent, self-optimizing systems. He works on embedding reasoning models into production infrastructure to power autonomous review, root-cause analysis, and analytics workflows. He brings over four years of engineering experience with deep expertise in the Elastic Stack, Apache Kafka, and Redis. Earlier he engineered a GDPR-compliant, end-to-end-encrypted secure web-chat application at Mithi. A Facebook Hackercup 2021 Round 2 qualifier and merit-scholarship recipient, Sandeep holds a B.Tech in Electrical Engineering from Delhi Technological University.

Add to Google preferred sources

Summarise with AI

Copied to Clipboard!
...

3000+ Browsers. One Platform.

See exactly how your site performs everywhere.

Try it free
...

Write Tests in Plain English with KaneAI

Create, debug, and evolve tests using natural language.

Try for free

Model Evaluation FAQs

Did you find this page helpful?

More Related Blogs

TestMu AI forEnterprise

Get access to solutions built on Enterprise
grade security, privacy, & compliance

  • Advanced access controls
  • Advanced data retention rules
  • Advanced Local Testing
  • Premium Support options
  • Early access to beta features
  • Private Slack Channel
  • Unlimited Manual Accessibility DevTools Tests