Browse the Knowledge Hub211 resources

Azure DevOps review: pricing, alternatives, pros and cons
Azure DevOps is Microsoft’s suite for planning, source control, CI/CD, test management and package hosting, offered as a cloud service and as Azure DevOps Server. For QA teams the two parts that matter are Azure Pipelines, which runs automated suites and publishes their results, and Azure Test Plans, which manages manual, exploratory and user acceptance testing linked to work items.
QAble has evaluated this tool and works alongside it. The factual sections are complete; our view is bounded to what we have actually seen rather than a long-term verdict.
- last reviewed
- 13 October 2026
- version covered
- Azure DevOps Services (October 2026)
- licence
- Freemium
At a glance
Azure DevOps at a glance
- Vendor
- Microsoft
- Category
- CI/CD, Test management, Defect tracking
- Licence
- Freemium
- Platforms
- Cloud, Self-hosted
- Languages
- YAML
- Integrates with
- GitHub, Jenkins, Selenium, Visual Studio
- First released
- 2018
- Version reviewed
- Azure DevOps Services (October 2026)
Verdict
Our verdict on Azure DevOps
Strengths
- Test cases, runs, bugs and requirements live in one traceable chain with Azure Boards
- Pipelines show a Tests tab with history, attachments and analytics from any JUnit, NUnit, xUnit, TRX or CTest results
- Built-in flaky test management can keep known flaky failures from failing a pipeline
- Azure Test Plans covers scripted manual tests, exploratory sessions and user acceptance testing in the browser
- Self-hosted agents are free in unlimited number, and Azure DevOps Server can run entirely on premises
Weaknesses
- Authoring test plans requires the Basic + Test Plans access level, priced per user well above Basic
- The free Microsoft-hosted parallel job must be enabled by linking an Azure subscription first
- PublishTestResults does not fail the pipeline on test failures by default
- Automatic flaky detection by rerun is tied to the Visual Studio Test task, so mostly .NET
- Several products in one interface, which takes time to learn and to administer
Our take
Azure DevOps makes most sense for organisations already planning work in Azure Boards, where test cases, test runs, bugs and requirements can sit in one traceable chain without integrations. Azure Pipelines is a capable CI system with better built-in test reporting than GitHub Actions, including flaky test management. Azure Test Plans is a full manual and exploratory test tool, though it needs the paid Basic + Test Plans access level for anyone who authors plans. QAble has evaluated it rather than maintained a long-running suite on it, so treat this as a bounded take. Watch the free hosted parallel job, which must be enabled by linking an Azure subscription, and note that public projects are retired: new ones cannot be created and existing ones convert to private in 2027. For a team that only needs CI, compare it with GitHub Actions before committing.
We have evaluated this tool rather than maintained a long-running suite on it, so this is a bounded view rather than a long-term verdict. The rest of this page is factual.
How it works
How Azure DevOps works
Organisations, projects and access levels
Everything lives in an organisation, divided into projects, and each user is given an access level. Stakeholder is free and limited, Basic covers Boards, Repos, Pipelines and Artifacts, and Basic + Test Plans adds the full test management feature set. That licensing model drives a lot of practical decisions for QA teams: developers can run pipelines and read test results on Basic, but whoever creates test plans and suites, or manages configurations needs Basic + Test Plans or an eligible Visual Studio subscription. Stakeholders can still run exploratory sessions with the Test & Feedback extension. The same products are available on premises as Azure DevOps Server, which has its own release cycle.
Pipelines, agents and parallel jobs
A YAML pipeline in the repository defines stages, jobs and steps, and each job runs on an agent: Microsoft-hosted virtual machines such as ubuntu-latest, windows-latest and macOS images, or self-hosted agents you install. Capacity is bought as parallel jobs, the number of jobs that can run at once, not as agents or minutes. Without the free grant or purchased parallel jobs, a pipeline queues. A job can declare strategy: parallel with a count, and each copy receives System.JobPositionInPhase and System.TotalJobsInPhase to pick its slice of the suite, with up to 99 agents for one job. A matrix strategy instead runs one copy per named set of variables.
Test results as first-class data
Test tasks such as Visual Studio Test, or the generic PublishTestResults task fed with JUnit, NUnit, xUnit, TRX or CTest files, send results to the test service rather than leaving them as files. Each pipeline run then has a Tests tab with pass rates, failures with stack traces, attachments and comparisons with earlier runs, and the Analytics service aggregates results over time for widgets and reports. Results can also be associated with test cases in Test Plans, so an automated run updates the status of the manual test case it automates. Publishing and failing are separate decisions: by default PublishTestResults reports failures without failing the task.
Test Plans as work items
Azure Test Plans stores test plans, test suites, test cases, shared steps and shared parameters as work items, so they have history, links, queries and permissions like any user story. Suites can be static, requirement-based or query-based, and a requirement-based suite tracks the test cases linked to one story. Testers run manual tests in the web-based Test Runner, which records steps, screenshots, action logs and screen recordings and attaches them to any bug filed from the run, with the bug linked to the requirement and build under test. Exploratory sessions run through the Test & Feedback browser extension, outside any plan.
Strengths
What it does well
Flaky test management
Turned on in project settings, flaky test management tags tests as flaky either automatically, when the Visual Studio Test task reruns a failure and it passes, or through an API for custom detection. Testers can also mark or unmark tests by hand. Each project chooses whether flaky failures still count in the test summary or are excluded so they do not fail the pipeline.
Traceability from requirement to result
Test cases link to user stories or features, automated tests can be associated with those test cases, and bugs filed from a test run link back to the requirement and build. A story card can show its test status, which gives release reviews an evidence trail without a separate test management tool.
Running automated tests from a test plan
The Azure Test Plan task, in public preview, runs the automated test points of a plan and suite for Maven, Gradle, PyTest or Jest projects, and the Visual Studio Test task does the same for .NET. Test leads can then run automated cases on demand from the plan, and results appear against the test cases they belong to.
Manual test execution with evidence
The web Test Runner walks a tester through each step, records pass or fail per step, and captures screenshots, image action logs and screen recordings. Bugs created during the run include that evidence automatically, which removes most of the back-and-forth when developers cannot reproduce a manual finding.
Parameters and configurations
Shared parameters let one test case run against many data rows, and test configurations, such as browser and operating system combinations, multiply test points so a plan shows what has been covered on which platform. Progress reports and charts then track completion by configuration, priority or tester.
Pipeline artefacts for evidence
PublishPipelineArtifact uploads screenshots, traces, videos and HTML reports to the run, downloadable from the pipeline summary and available to later stages. With a condition such as failed(), only the runs that need evidence store it.
Pricing
Azure DevOps pricing and licensing
Azure DevOps Services is priced per user plus pipeline capacity. The Basic plan is free for the first 5 users, then charged per user, and includes the free Pipelines grant and 2 GiB of Artifacts storage. Basic + Test Plans is a separate, higher per-user price with a 30-day trial. Pipelines capacity is bought as parallel jobs. Visual Studio subscribers get access without counting against the free users. Azure DevOps Server is licensed separately for on-premises use.
- User plans, list prices on 13 October 2026: Basic free for the first 5 users, then $6 per user per month; Basic + Test Plans $52 per user per month.
- Free Pipelines grant for private projects: one Microsoft-hosted parallel job with 1,800 minutes a month and 60 minutes per run, plus one self-hosted parallel job with unlimited minutes. The hosted grant requires linking an Azure subscription.
- Extra parallel jobs, list prices on 13 October 2026: $40 a month per Microsoft-hosted job with unlimited minutes, $15 a month per self-hosted job. Any number of self-hosted agents can be registered; you pay for concurrency, not agents.
- Azure Artifacts: 2 GiB free per organisation, then tiered per-GiB pricing.
- Public projects are retired: new ones cannot be created, and existing ones keep their free grants until they convert to private in 2027.
Checked against the vendor’s own pages on 13 October 2026. Pricing changes; confirm on the official site before buying.
Getting started
Getting started with Azure DevOps
Setup, step by step
- Create an organisation and project, and link an Azure subscription so the free hosted parallel job is granted.
- Make sure the suite runs headless from one command and writes JUnit XML.
- Add azure-pipelines.yml to the repository and create a pipeline from it.
- Publish test results with condition: succeededOrFailed() so failures are reported.
- Upload screenshots or traces with PublishPipelineArtifact when a run fails.
- For manual testing, assign Basic + Test Plans to test leads and create a test plan with requirement-based suites.
Install
# No install for the cloud service: commit azure-pipelines.yml,
# then create the pipeline from it in Pipelines > New pipeline.
# Self-hosted agents are downloaded from Project settings > Agent pools.A first example
# azure-pipelines.yml
trigger:
branches:
include: [main]
pool:
vmImage: ubuntu-latest
steps:
- task: Maven@4
displayName: Run tests
inputs:
mavenPOMFile: pom.xml
goals: verify
options: -B
jdkVersionOption: '1.21'
publishJUnitResults: false # published below so failures still report
- task: PublishTestResults@2
condition: succeededOrFailed()
inputs:
testResultsFormat: JUnit
testResultsFiles: '**/target/*-reports/TEST-*.xml'
testRunTitle: API and UI tests
failTaskOnFailedTests: true # the default is false
- task: PublishPipelineArtifact@1
condition: failed()
inputs:
targetPath: target/screenshots
artifact: screenshotsWhat trips people up first
A pipeline that queues forever or reports green despite failures. The first happens in new organisations because the Microsoft-hosted free tier is not active until an Azure subscription is linked through billing; until then hosted jobs have no parallel job to run on. The second happens because PublishTestResults defaults failTaskOnFailedTests to false, so if the test command was configured not to fail the build, the run shows failing tests in the Tests tab under a green status. Decide which step owns failure: either the test command exits non-zero, or the publish task sets failTaskOnFailedTests: true.
In practice
Using Azure DevOps in practice
Separating automated and manual work
Keep the two halves of testing in the parts of the product built for them. Automated suites belong in YAML pipelines in the repository, with results published to each run, so developers see failures on the pull request. Manual, exploratory and user acceptance testing belong in Test Plans, organised as one plan per release or sprint with requirement-based suites, so coverage is visible on the stories themselves. Link the two only where it adds value: associating an automated test with a test case is worth it for regulated or audited features, where the test case is the record, and rarely worth it for the bulk of a regression suite.
Sharding a browser suite with a matrix
A matrix strategy runs one copy of a job per entry, each with its own variables, in parallel up to the parallel jobs you have. Pass the shard to a runner that supports it, publish each copy’s JUnit file, and the run’s Tests tab combines them. Give each copy a distinct testRunTitle so failures are attributable to a browser and shard. Count the matrix entries against your parallel jobs: four entries on the single free hosted job run one after another, not at once.
jobs:
- job: e2e
pool:
vmImage: ubuntu-latest
strategy:
matrix:
chromium_1: { project: chromium, shard: 1/2 }
chromium_2: { project: chromium, shard: 2/2 }
firefox_1: { project: firefox, shard: 1/2 }
firefox_2: { project: firefox, shard: 2/2 }
steps:
- script: npm ci && npx playwright install --with-deps
displayName: Install
- script: npx playwright test --reporter=junit --project=$(project) --shard=$(shard)
displayName: Run tests
env:
CI: 'true'
PLAYWRIGHT_JUNIT_OUTPUT_NAME: results.xml
- task: PublishTestResults@2
condition: succeededOrFailed()
inputs:
testResultsFormat: JUnit
testResultsFiles: results.xml
testRunTitle: e2e $(project) $(shard)Handling flaky tests
Turn on flaky test management in project settings first, and decide whether flaky failures should be excluded from the test summary. Automatic detection by rerun works with the Visual Studio Test task, which can rerun failed tests in the same execution; for Java, JavaScript and Python suites, rerun inside the test runner instead, with Surefire’s rerunFailingTestsCount, Gradle’s test-retry plugin or Playwright retries, and mark persistent offenders as flaky by hand or through the API. The setting is per project, and switching between system and custom detection erases the flakiness history, so choose once. Review the flaky list as part of sprint work rather than letting it grow.
Running test plan cases from a pipeline
For teams that keep formal test cases, the Azure Test Plan task runs the automated test points of a chosen plan, suite and configuration, and records results against those test cases. It supports Maven, Gradle, PyTest and Jest projects and is in public preview, so treat it as useful but subject to change. Unlike PublishTestResults, it fails on test failures by default. Plan, suite and configuration are passed as IDs, which you can read from the Test Plans hub, so keep them in pipeline variables rather than scattered through YAML files.
- task: AzureTestPlan@0
inputs:
testSelector: automatedTests
testPlanOrRunSelector: testPlan
testPlan: '42' # plan ID from Test Plans
testSuite: '43'
testConfiguration: '1'
testLanguageInput: JavaMaven
pomFilePath: pom.xml
failTaskOnFailedTests: true # the default for this taskAgents, capacity and cost
Parallel jobs are the unit that limits throughput, so plan them before sharding. Microsoft-hosted agents give a clean machine per job but count against hosted parallel jobs and, on the free grant, cap each run at 60 minutes. Self-hosted agents cost nothing to register and are bought only as concurrency, which makes them the economical option for long browser suites, test environments inside a private network or device labs; scale sets can create and remove them on demand. Keep pipeline YAML in templates shared across repositories, so the test job, its result publishing and its artefact rules are defined once.
Pitfalls
Common pitfalls
Pipelines stuck in the queue in a new organisation
Why it happens: The Microsoft-hosted free tier is not active until the organisation is linked to an Azure subscription through billing, so hosted jobs have no parallel job to run on.
The fix: Set up billing with a valid Azure subscription to receive the free grant, or register a self-hosted agent, which has its own free parallel job.
Failures published but the run stays green
Why it happens: PublishTestResults defaults failTaskOnFailedTests to false. If the test step was set not to fail, failures show in the Tests tab under a passing run.
The fix: Let the test command fail the job, or set failTaskOnFailedTests: true on the publish task, and give it condition: succeededOrFailed().
Test results not published when tests fail
Why it happens: Steps run only after successful steps by default, so a failing test command skips the publish step.
The fix: Add condition: succeededOrFailed() to PublishTestResults and condition: failed() or succeededOrFailed() to evidence uploads.
Expecting automatic flaky detection for Java or JavaScript
Why it happens: System detection reruns failures through the Visual Studio Test task, which is aimed at .NET. Other runners report results but are not rerun by Azure DevOps.
The fix: Rerun in the test runner, mark known flaky tests manually or through the Result Meta Data API, and exclude flaky failures from the summary if that is the policy.
Buying the wrong access level for testers
Why it happens: Basic users can run pipelines and view results but cannot create test plans and suites or manage configurations, which surprises teams after rollout.
The fix: Assign Basic + Test Plans to those who author and manage plans; Stakeholder or Basic is enough for exploratory testing with the Test & Feedback extension.
Planning around public projects
Why it happens: Public projects are retired. New ones cannot be created, and existing ones convert to private in 2027, losing their larger free grants.
The fix: Host open source test tooling on GitHub, and plan pipeline capacity for existing public projects on the private-project free tier.
Compared
Azure DevOps alternatives compared
| Tool | Hosting | Free allowance | Built-in test results view | Flaky test handling | Manual test management | Parallel test runs |
|---|---|---|---|---|---|---|
| Azure DevOps | Cloud service or Azure DevOps Server | One hosted job, 1,800 minutes, enable first | Yes, Tests tab with analytics | Built-in flaky management; VSTest reruns | Yes, Azure Test Plans, paid access level | parallel strategy, up to 99 agents |
| GitHub Actions | GitHub-hosted or self-hosted runners | 2,000 minutes a month on Free | No; marketplace actions add check runs | None built in; runner retries | No | Matrix, up to 256 jobs per run |
| GitLab CI/CD | GitLab.com, self-managed or Dedicated | 400 compute minutes a month on Free | Yes, in merge requests and pipelines | 14-day failure count on default branch | No dedicated test case manager in CI | parallel: 1 to 200, plus matrix |
| Jenkins | Self-hosted only | All free; you pay for servers | Yes, with history and trends | Via build tool reruns and plugins | No | Matrix, parallel stages, timing-based splitting |
FAQ
Frequently asked questions
What are the best Azure DevOps alternatives?
The alternatives most often weighed against Azure DevOps are GitHub Actions, GitLab CI/CD, Jenkins and Jira. The comparison on this page sets them side by side on hosting, free allowance, built-in test results view, flaky test handling, manual test management and parallel test runs, and the verdict above says where Azure DevOps is the wrong choice and which of them to pick instead.
Is Azure DevOps free?
Partly. The Basic plan is free for the first 5 users and includes one Microsoft-hosted parallel job with 1,800 minutes a month, once an Azure subscription is linked, plus one self-hosted parallel job with unlimited minutes and 2 GiB of Artifacts storage. More users, more parallel jobs and Azure Test Plans are paid. Visual Studio subscribers get access without counting against the free users.
Is Azure Test Plans included in Azure DevOps?
Only partly. Anyone can run exploratory tests with the Test & Feedback extension, and Basic users can run tests assigned to them, but creating and managing test plans, suites and configurations needs the Basic + Test Plans access level, which had a list price of $52 per user per month on 13 October 2026, or an eligible Visual Studio subscription. A 30-day trial is available.
Azure Pipelines or GitHub Actions?
If the code is on GitHub and nothing ties you to Boards or Test Plans, GitHub Actions is simpler and has the larger ecosystem. Azure Pipelines is the better fit when work tracking and test management already live in Azure DevOps, because results, test cases and bugs connect without integrations, and its built-in Tests tab and flaky test management go further than Actions without extra tools. Azure Pipelines can also build code hosted on GitHub.
How do I publish Selenium or Playwright results to Azure Pipelines?
Make the runner write JUnit XML, then add PublishTestResults@2 with testResultsFormat: JUnit, a glob for the files and condition: succeededOrFailed() so it runs after failures. Give each run a testRunTitle to tell shards and browsers apart, and upload screenshots, videos or traces with PublishPipelineArtifact. The run’s Tests tab then shows failures, history and attachments.
Can Azure DevOps detect flaky tests?
Yes, with limits. Flaky test management, enabled in project settings, marks a test flaky automatically when the Visual Studio Test task reruns a failure and it passes, and accepts flaky flags from other systems through an API. Testers can also mark tests flaky by hand. Each project chooses whether flaky failures count in the summary. For non-.NET suites, rerun in the test runner and mark tests manually or through the API.
Is Azure DevOps being replaced by GitHub?
Microsoft has not announced an end of life for Azure DevOps Services, and Azure DevOps Server received a patch on 10 September 2026. Two recent changes are worth knowing: public projects are retired, with existing ones converting to private in 2027, and GitHub Advanced Security and Copilot code review are now sold for Azure DevOps. For a new project that needs neither Boards nor Test Plans, compare it with GitHub before committing.
Can I run Azure DevOps on premises?
Yes. Azure DevOps Server is the self-hosted edition, with Boards, Repos, Pipelines, Test Plans and Artifacts, and it has no separate charge for self-hosted parallel jobs: the number of agents is the only limit. New features usually reach the cloud service first, and some, such as flaky test management, are documented as cloud only.
Alternatives
Azure DevOps alternatives worth weighing
GitHub Actions
CI/CD built into GitHub: YAML workflows in the repository, run on GitHub-hosted Linux, Windows and macOS runners or on your own.
Jira
Atlassian’s work tracking tool, used by many QA teams as the system of record for defects, linked to stories, releases and test management apps.
GitLab CI/CD
CI/CD integrated into GitLab, covering the full lifecycle from source through security scanning to deployment.
Resources
Where to go next
Picking the wrong tool costs more than picking late.
QAble advises on toolchain decisions and then implements them, with engineers who have run these tools on real delivery. Start with a free QA audit.