Azure DevOps Services Explained: Boards, Repos, Pipelines, Test Plans
A deep-dive explanation of all five Azure DevOps services — Boards, Repos, Pipelines, Test Plans, and Artifacts — with a focus on how QA engineers use each service and how they connect in a real testing workflow.
Azure DevOps bundles five distinct services into a single platform. You can use them all together or connect individual services to other tools — Azure Pipelines works with GitHub repos, Azure Boards works with external issue trackers, and so on. Understanding each service individually is the foundation for understanding how they work together.
This article covers all five services from a QA engineer's perspective.
Azure Boards
What it is: A work item tracking system similar to Jira, Linear, or GitHub Issues.
What QA engineers do here:
- Review user stories and acceptance criteria before writing test cases
- Create and track bugs through the defect lifecycle
- Query and filter work items using saved queries
- View and contribute to the sprint board and backlog
- Build dashboard widgets showing QA metrics
The Boards hierarchy
Epic (quarters)
└── Feature (weeks to months)
└── User Story (days to a sprint)
└── Task (hours)
└── Bug (when a defect is found)
Key QA uses of Azure Boards
Acceptance Criteria field: Every User Story should have this filled. It's your testing contract — if the AC says "error message must include the field name", your test case validates exactly that.
Bug states: New → Active → Resolved → Closed. As QA, you move bugs from Resolved to Closed after verifying the fix. Never close a bug without verifying it — this breaks the bug's resolution date metrics.
Queries for QA: The most useful queries for QA teams:
// All open bugs in current sprint
Type = Bug AND Iteration = @CurrentIteration AND State <> Closed
// High-priority bugs without an owner
Type = Bug AND Priority <= 2 AND Assigned To = [Unassigned]
// Bugs found in testing vs bugs found in production
Type = Bug AND Tags CONTAINS "found-in-testing"
Azure Repos
What it is: A full Git repository hosting service, similar to GitHub or GitLab.
What QA engineers do here:
- Store test automation code alongside the application code (or in a separate test repo)
- Review pull requests that include test changes
- Set up branch policies that require tests to pass before merging
Branch policies for QA enforcement
Branch policies on the main or release branches can enforce quality gates. Go to Repos → Branches → Branch Policies:
✓ Require a minimum of 2 reviewers
✓ Check for linked work items (ensures every PR has a user story linked)
✓ Build validation: must pass the CI pipeline including tests
✓ Required reviewer: QA lead must approve for changes to test-critical paths
Test code organisation
A clean repo structure for test automation:
tests/
e2e/
checkout.spec.ts
auth.spec.ts
api/
orders.test.ts
users.test.ts
fixtures/
test-data.json
utils/
helpers.ts
playwright.config.ts
azure-pipelines.yml
Keeping tests in the same repo as the application code ensures they're always versioned together — no test-to-code mismatch when checking out a specific release.
Azure Pipelines
What it is: A CI/CD automation service that builds, tests, and deploys code.
What QA engineers do here:
- Set up automated test stages in the pipeline
- Monitor pipeline runs for test failures
- Investigate flaky tests vs genuine product regressions
- Configure scheduled runs for nightly regression suites
Pipeline YAML structure for testing
trigger:
branches:
include:
- main
- feature/*
pool:
vmImage: ubuntu-latest
stages:
- stage: Build
jobs:
- job: BuildApp
steps:
- task: NodeTool@0
inputs:
versionSpec: '20.x'
- script: npm ci
- script: npm run build
- stage: Test
dependsOn: Build
jobs:
- job: UnitTests
steps:
- script: npm test -- --reporter=junit --output-file=results/unit.xml
- task: PublishTestResults@2
inputs:
testResultsFormat: JUnit
testResultsFiles: results/unit.xml
condition: always()
- job: E2ETests
steps:
- script: npx playwright test --reporter=junit
- task: PublishTestResults@2
inputs:
testResultsFormat: JUnit
testResultsFiles: playwright-report/results.xml
condition: always()
- task: PublishPipelineArtifact@1
inputs:
targetPath: playwright-report
artifact: e2e-report
condition: always()The condition: always() rule
Always add condition: always() to PublishTestResults tasks. Without it, the task only runs when the previous step succeeded — meaning a test failure prevents test results from being uploaded, which defeats the entire purpose.
Azure Test Plans
What it is: A dedicated test management service for manual test cases, exploratory testing, and linking automated results to formal test plans.
What QA engineers do here:
- Write and organise test cases
- Execute manual tests using Test Runner
- Track test execution progress across a sprint
- Link automated test results to formal test plans
- Generate test reports for stakeholders
Test Plans vs pipelines: the distinction
Azure Pipelines runs automated tests and stores the results. Azure Test Plans manages the test inventory — the catalogue of what should be tested. They connect when a pipeline publishes results and those results are associated with test cases in Test Plans.
Azure Test Plans: What to test (inventory)
Azure Pipelines: Running the tests (execution)
Link between them: PublishTestResults task
Requirement-based test suites
The most powerful feature for traceability. Create a Query-based suite using:
Type = User Story AND Iteration = @CurrentIteration AND State = Active
Azure DevOps automatically populates the suite with all User Stories in the current sprint. Test cases linked to those User Stories appear inside them. As stories complete and new ones enter the sprint, the suite updates automatically.
Azure Artifacts
What it is: A package manager and feed hosting service for NuGet, npm, Maven, PyPI, and Universal Packages.
What QA engineers typically do here:
- Publish and consume internal test utility packages
- Cache package downloads for faster pipeline runs
- Version and share test fixtures, page object models, or shared test utilities as internal packages
Using Artifacts for test utilities
If your QA team maintains a shared page object model library or a test data generation utility, Artifacts lets you publish it as a private package:
# Publish a shared test utility as an npm package
- task: Npm@1
inputs:
command: 'publish'
publishRegistry: 'useFeed'
publishFeed: 'MyOrg/qa-utilities'Other teams can then install it:
npm install @myorg/qa-utilities --registry https://pkgs.dev.azure.com/MyOrg/...This eliminates copy-paste maintenance of common test code across multiple repos.
How the five services work together
Here's the full flow for a feature going through development and testing:
1. Boards: QA reviews User Story #847 acceptance criteria
2. Boards: QA creates test cases linked to #847
3. Repos: Dev writes code and opens PR
4. Pipelines: PR triggers CI pipeline — unit tests run automatically
5. Repos: Pipeline passes → QA reviews and approves PR
6. Repos: Code merged to main
7. Pipelines: Deployment pipeline runs — deploys to staging environment
8. Test Plans: QA runs manual tests against staging using Test Runner
9. Boards: QA raises Bug #891 from failed test case → linked to #847
10. Repos: Dev fixes bug, opens new PR
11. Pipelines: CI runs again — tests pass
12. Test Plans: QA verifies fix → closes Bug #891, marks test case Passed
13. Boards: User Story #847 → state changes to Closed
14. Boards: Sprint dashboard shows 100% pass rate for #847's test cases
Every step flows through Azure DevOps. The traceability is automatic — you can start at a User Story and trace all the way to which pipeline run validated it and which test cases passed.
Common errors and fixes
Error: PublishTestResults task shows no results after running
Fix: Verify the testResultsFiles glob pattern matches your output file. Test with an explicit path first (**/junit-results.xml), then generalise.
Error: Branch policy blocks merges even when tests pass
Fix: Ensure the build validation policy points to the correct pipeline definition. Policies on main must reference the pipeline that runs on PRs to main.
Error: Azure Artifacts feed returns 401 in the pipeline
Fix: Add the project build service account ({Project} Build Service) to the Artifacts feed as a Contributor. Go to Artifacts → Feed Settings → Permissions.
Error: Test Plans shows "No test cases" even after creating test cases Fix: Test cases must be added to a Test Suite inside a Test Plan. Creating a test case work item doesn't automatically add it to a plan — you must add it explicitly or use a query-based suite.
Stay ahead in AI-driven QA
Get practical tutorials on test automation, AI testing, and quality engineering — straight to your inbox. No spam, unsubscribe any time.
Discussion
Sign in with GitHub to comment · powered by Giscus