
You prove an application still works after a VMware migration by testing what its users and connected systems do with it, not by checking that the virtual machine booted. Record a baseline of every business-critical journey on VMware before anything moves, then run the identical tests after cutover on the target and compare the two runs screen by screen. The comparison, with screenshots and a defect log, is the evidence for the go or no-go decision.
Short answer: a running VM proves the infrastructure moved. Only a re-run of the same business journeys, with the same data and checks as the pre-migration baseline, proves the application moved with it.
Testing is the part of a VMware exit plan that is easiest to squeeze. The deadlines push the other way: licence-included pay-as-you-go Azure VMware Solution (AVS) deployments must move to portable VCF by 31 October 2026, and vSphere 8 reaches end of general support on 11 October 2027. This post sets out a testing method that keeps pace with those dates. It sits under our main guide, Leaving VMware After Broadcom, and the testing cost belongs in your renewal versus Azure cost model.
Infrastructure checks answer infrastructure questions. Is the VM running? Does it answer a ping? Is the service started? Those checks matter, but they say nothing about whether a user can raise an invoice, approve an order or run the month-end report.
A migration changes the things around the VM. Azure Migrate's network discovery for VMware and NSX (preview, August 2026) shows how much sits there: subnets, VLANs, NSX segments, port groups, load balancers, and firewall and NAT policies. Any of those can change during a move, and the VM will still report healthy.
| What infrastructure checks prove | What they do not prove |
|---|---|
| The VM is running on the target | Users can log in and complete their work |
| The OS and services started | The application reads and writes the right data |
| The VM answers on the network | Partners, APIs and file transfers still reach it |
| Disk and CPU look normal | Scheduled jobs, reports and emails still run |
| Monitoring shows green | Screens show the same results as before the move |
The route changes how much moves. AVS runs the same vSphere, vSAN and NSX stack in Azure, so the application sees the least change, although its network location and connections still move. A rehost to Azure VMs swaps the platform underneath. A move to containers is a rebuild, and Microsoft documents behaviour differences that matter on that route: Windows nodes on AKS do not preserve client source IP and have a fixed four-minute TCP timeout. An IP allow-list at a partner, or a long-running connection, can fail there and nowhere else. On-premises, Harvester's VM import add-on shuts down the source VM and converts its disks before creating the new one, so the imported VM is a new machine in practice.
Our post on choosing a route for each workload covers those routes in depth. Whichever you choose, the test method is the same.
The baseline is a recorded run of your tests on VMware, before migration, for every business-critical journey. It becomes the reference that the post-cutover run is judged against.
Start with the journeys, not the servers. For each application, ask its owner which tasks would stop the business if they broke: posting a sales order, receiving stock, running payroll, producing a customer statement. Then add the journeys that run without a person, such as overnight imports, interfaces and scheduled reports.
Azure Migrate helps you find what you might miss. Its agentless dependency analysis covers up to 3,000 servers per appliance and shows which servers talk to which. Automatic application discovery (preview, May 2026) groups servers into applications. Dependencies you did not know about become integration checks.
Each journey needs five things written down:
Run the baseline more than once. Two clean runs tell you which differences are natural, such as dates, reference numbers and timestamps, so they are not flagged as failures later. Then freeze the application: no releases between baseline and cutover, or a fresh baseline after any release that does happen. Otherwise you cannot tell whether a difference came from the migration or from the change.
AI agents make this practical across a whole estate. They run the regression tests, then open the application and work through each journey through the user interface, clicking, entering data and moving between screens, recording a screenshot and a log line at each step. Our Agentic Software Delivery capability describes how we run agents in a delivery process.
You run the same tests, with the same data and accounts, against the target. Nothing in the test changes except the address it points at. If the test needs editing to pass, that edit is itself a finding.
We recommend two post-migration runs per wave. The first is a rehearsal: migrate a copy, run the full baseline against it, fix what breaks, and repeat. For VMware, Microsoft recommends Azure Migrate agentless replication, which uses vSphere snapshots and Changed Block Tracking. The second run happens in the cutover window itself, on the real target, before users return.
The target shapes what to watch for:
The comparison takes the baseline run and the post-cutover run for each journey and lines them up step by step. Each step has a result (pass or fail against the expected value) and a pair of screenshots, before and after.
Agents flag every difference and sort it into one of three groups:
| Difference | Example | What happens |
|---|---|---|
| Expected | A new server name in a report footer | Recorded and accepted in the pack |
| Cosmetic | A font or layout shift with the same data | Reviewed by the application owner |
| Functional | A missing value, an error message or a failed step | Raised as a defect in Azure DevOps |
The pairing matters more than the pass mark. A screen that "passes" can still show a blank field that used to hold a value from another system. A person reviewing the side-by-side screenshots spots that in seconds. A person reading a log line saying "step 7: pass" does not.
Integrations are where a move is most likely to break something, because each one depends on addresses and rules that live outside the VM. Check each integration in both directions, and check the data, not just the connection.
Some integrations run rarely. A monthly batch, a quarter-end extract or a year-end process will not run during a weekend cutover. List them, schedule a check at their first run after go-live, and keep the old environment available until they have passed.
The best integration test runs through the user interface. Our anonymised release-testing client has agents check what appears on screen at each step, including data that arrives through integrations. A journey that shows the right order status from a connected system has proved the integration end to end.
Every functional difference becomes a work item in Azure DevOps, so fixes are tracked in the same place as the rest of the delivery work. The flow mirrors the bug verification we run for a client today:
A bug is only reported as fixed once an agent has repeated the original steps and seen the correct result. That rule stops "resolved" tickets from reaching the go or no-go meeting unchecked.
| Step | When | What happens | Output | Who decides |
|---|---|---|---|---|
| 1. Agree journeys | Before the wave is planned | Owners list business-critical journeys and integrations | Journey register | Application owners |
| 2. Build tests | Before baseline | Agents create or update UI and regression tests for each journey | Test suite per application | Test lead |
| 3. Baseline on VMware | Before migration | Agents run all tests at least twice and record screenshots | Baseline results | Test lead accepts |
| 4. Freeze | Baseline to cutover | No releases, or a fresh baseline after any release | Change freeze record | Change board |
| 5. Rehearsal re-test | Before cutover | Same tests on a migrated copy | Rehearsal difference report | Migration lead |
| 6. Fix and repeat | After rehearsal | Defects raised, fixed and verified in Azure DevOps | Closed or accepted defects | Application owners |
| 7. Cutover re-test | In the cutover window | Same tests on the real target before users return | Cutover difference report | Test lead |
| 8. Evidence pack | End of cutover window | Results, defects, exceptions and rollback position collected | Evidence pack | Prepared by agents, checked by test lead |
| 9. Go or no-go | End of cutover window | Decision makers review the pack | Signed decision | Change board |
| 10. First-run checks | After go-live | Rare jobs tested at their first run | Updated pack | Application owners |
| Check | Pass when | Evidence |
|---|---|---|
| Baseline is current | No release since the last baseline | Version recorded in both runs |
| Rehearsal defects closed | Every functional defect is closed or formally accepted | Azure DevOps query |
| Rollback is ready | The source VMs can be restarted and the steps are written | Rollback runbook, named owner |
| DNS and certificates | Names resolve to the target and certificates are valid | Agent step log |
| Firewall and NAT rules | Every listed integration connects | Integration check results |
| Partner allow-lists | Partners have confirmed new IP addresses | Partner confirmations |
| User journeys | All business-critical journeys match the baseline | Difference report with screenshots |
| Integrations | Data arrives and leaves correctly, checked on screen | Screenshot pairs |
| Scheduled jobs | Jobs due in the window have run | Job history |
| Backups and monitoring | First backup succeeded; alerts reach the right team | Backup report, test alert |
| Rare jobs | Month-end and other rare jobs scheduled for a first-run check | Calendar entries |
| Sign-offs | Owners and change board have signed | Signed decision |
The evidence pack is the document the go or no-go meeting reads. It should let someone who was not in the cutover room see what was tested, what was found and what is still open.
A complete pack contains the journey register and test scope, the baseline results, and the post-cutover results with the difference report. It includes screenshot pairs for every flagged difference, the integration check results, and the Azure DevOps defect list with each item's status. It closes with the accepted exceptions (each with an owner and a fix date), the rollback position, and the sign-offs.
Keep the pack after go-live. It records the state of each application on the day it moved, which helps the managed service team and any later audit.
Agents do the repetitive work: running tests, capturing screenshots, comparing runs, raising and re-checking defects. People make every decision that carries risk.
We also recommend that agents have test access only, with no rights to change production configuration. Fixes go through your normal change process.
Our VMware exit case study covers the migration side: an oil and gas company in Scotland left its own VMware infrastructure by three routes. The testing capability this method relies on is published separately. In our anonymised release-testing case study, agents test every release of a client's own applications before it ships. They run the regression suite, test the affected journeys through the user interface with screenshots, and verify every Azure DevOps bug fix in the running system. The client's team makes each release decision, and 15+ testing roles are no longer needed.
That work is release testing, not migration. The mechanics carry across unchanged: a baseline, a re-run, a comparison with screenshot evidence, and defects verified in Azure DevOps before a person closes them. Our VMware exit service builds that testing into every migration wave.
We baseline the business-critical journeys on VMware, re-test them on the target after cutover and hand you the evidence pack for the go or no-go decision.
Or call us directly: 01625 569 777