World’s largest virtual agentic engineering & quality conference
Voice agent testing without code: dial your agent over real phone calls, scored across 30+ metrics from intent recognition to containment and CSAT.

Frank Joseph
Author

Salman Khan
Reviewer
Last Updated on: July 23, 2026
Last week a payment got confirmed against the wrong account. A caller with a Glasgow accent read out their card number, the voice agent transcribed two of the digits wrong, and it still moved ahead and read a balance back as if everything matched. Nobody noticed until the customer called in angry. I wanted to reproduce that failure, but I did not fancy sitting there dialing the line by hand forty times. So I ran one full voice agent testing session against the line instead, and what follows is the whole thing, from the number I typed in first to the pipeline check that now runs on every prompt change.
The agent under test is an inbound banking support line. It checks balances, disputes charges, and resets PINs, and it is supposed to confirm a caller's identity before it says anything sensitive out loud. That last rule is the one that broke.
Setup took about four minutes. TestMu AI does not need an SDK or a browser extension to reach a phone agent, so the same setup covers a voice agent built on Vapi as easily as this line wired up over Twilio, which is what got me past the usual first hurdle. I gave it three things and nothing more. First, the agent's phone number. Second, a short description of what the agent is and the one hard rule it has to keep, written the way I would brief a new hire: you are a banking support line, help callers check balances, dispute charges, and reset PINs, and never read a balance until you have verified identity. Third, the caller I wanted on the other end, which for this first run was the Glasgow accent from the incident, phoning from a noisy room.
If your agent was built from a spec or a policy document, you can upload that file instead of typing the description out. The platform reads the constraints and the tone rules straight from it and uses them as the baseline for what a correct answer looks like.
This is where the gap from a scripted approach opened up. If I were verifying a single balance lookup against the telephony API by hand, the check would read something like this:
const call = await twilioClient.calls.create({
to: "+15551234567",
from: process.env.TEST_LINE,
twiml: "<Response><Say>I want to check my account balance</Say>" +
"<Pause length='4'/><Record maxLength='8'/></Response>",
});
await waitForRecording(call.sid);
const transcript = await transcribe(call.recordingUrl); // one synthetic voice, no noise
if (!transcript.toLowerCase().includes("your balance is")) {
throw new Error("Agent did not read the balance. Got: " + transcript);
}Barely a dozen lines, and it proves almost nothing. One synthetic voice, dead silence, one fixed phrase, one hardcoded substring. It never asks whether the agent understood the caller, whether it checked identity first, or whether it stayed civil under pressure. Reword the greeting and the assertion snaps. My Glasgow scenario would need a different voice fixture, noise injection, and a fuzzy match that this snippet does not have, and every one of those is more code to write and maintain.
The same goal, handed to TestMu AI, is three plain sentences with nothing to maintain afterward:
That is what I handed to voice agent testing on TestMu AI. Rather than a script, autonomous phone-caller agents place a real call to the number and hold the conversation like a customer would. I described who was calling and what counted as a pass, and the platform took care of the dialing, the transcription, the timing, and the retries.
The call ran in front of me. I could see the duration ticking and a live transcript with each speaker labeled, so it was obvious who said what and when. The Glasgow caller asked for a balance, and the agent, instead of running the identity check, read a number straight out. The transcript marked the exact turn where it went wrong.

When the call ended, TestMu AI scored it across more than thirty call metrics, from intent recognition accuracy and speech-to-text accuracy to first call resolution, containment rate, and an estimated CSAT. Every score carried a confidence level and an excerpt from the transcript as evidence, so the low speech-to-text number pointed straight at the two mangled card digits, and the identity rule showed up as a hard fail with the offending line quoted underneath it. The run came back Red, which on this platform means not production ready, and the reason sat there in plain language instead of a stack trace at line 47.
One reproduced bug is a start. Real coverage meant adding the calls I expected to break, and widening it took more description rather than more code. Over the next twenty minutes I stacked up a handful of new callers.
I sent a caller who started in English and switched to Spanish mid-sentence, then checked that the account number came through intact instead of getting garbled at the language boundary. I placed the same balance request twice, once on the call-center-floor noise preset and once over a poor cellular connection, to see whether speech-to-text held up or whether the agent started asking the caller to repeat every line. I ran an angry caller who opened calm about a bill and then demanded a refund halfway through, watching whether the agent kept a steady tone and either resolved the new intent or escalated to a human cleanly. And I walked a caller through the phone menu, pressing 2 and then 4, to confirm the button presses routed to billing and the caller never got dumped back at the top, which is a classic IVR testing failure that DTMF detection catches.
All of those ran across 200+ voice profiles, 50+ accents and dialects, and 15 background-noise presets from the same descriptions, with no per-voice rewrites on my end. It is the same evaluation engine behind agent testing for chat and image agents, so the plain-English approach you would use to test a chatbot carries straight over to the phone line. Once the fix shipped and the agent went live again, I stopped dialing altogether and uploaded a batch of the previous week's recorded calls instead, running the same thirty-plus metrics over real traffic. That is how the original Glasgow call would have surfaced on a Monday morning rather than through a complaint.
One caller at a time proves the agent is correct on a quiet line. It says nothing about how that line holds up when forty people call at once, which is the part of voice agent testing a single scripted call never reaches.
So before I handed the suite off, I pointed the same scenarios at the number in parallel. TestMu AI runs five concurrent phone calls per org out of the box, and you can add parallel capacity when you want a heavier load test. I watched the scores hold while the calls overlapped, checking that speech-to-text did not slip and that the identity rule kept firing under pressure rather than only on a single quiet call.
The last job was making sure the fix stayed fixed. A voice agent can regress the day someone edits its prompt or its underlying model gets an upstream update, and no one puts that on a calendar. So the same scenarios now run in two places without me touching them.
In the deploy pipeline, the testmu-a2a command runs the suite and returns exit code 1 on a Red verdict, which fails the build before a prompt change reaches callers. It writes JUnit output, so the results land in the same test report as every other check the team already reads. Outside the pipeline, the suite runs on a schedule, weekly in my case, though it accepts a full cron expression if you want weekday mornings only. When a verdict slips from Green toward Red, it posts to Slack straight away, and email and webhooks are there too if you route alerts elsewhere.
That is the session. It started as one embarrassing call and finished as a check that guards the line on every change, and at no point did I open a telephony SDK or babysit an assertion. The calls that reach your voice agent are messy, full of accents, background noise, and people who change their mind partway through a sentence. Test it against those, described the way real callers actually behave.
Note: Test your voice agent over real phone calls, no code required. Start with TestMu AI free.
Author
Frank Joseph is an API documentation engineer and technical writer based in Lagos, Nigeria, with a background in software engineering and a degree in Computer Science. With over four years of experience, he specializes in creating developer-focused API documentation using tools like Postman, Markdown, MDX, Docusaurus, and GitHub. On TestMu AI (formerly LambdaTest), he wrote the guides on PHP testing with Codeception and low-code automation testing.
Reviewer
Salman is a Test Automation Evangelist and Community Contributor at TestMu AI, with over 6 years of hands-on experience in software testing and automation. He has completed his Master of Technology in Computer Science and Engineering, demonstrating strong technical expertise in software development, testing, AI agents and LLMs. He is certified in KaneAI, Automation Testing, Selenium, Cypress, Playwright, and Appium, with deep experience in CI/CD pipelines, cross-browser testing, AI in testing, and mobile automation. Salman works closely with engineering teams to convert complex testing concepts into actionable, developer-first content. Salman has authored 120+ technical tutorials, guides, and documentation on test automation, web development, and related domains, making him a strong voice in the QA and testing community.
Did you find this page helpful?
More Related Blogs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance