When I started in QA, my job was simple. Open the app, follow the test cases, file bugs in Jira. Repeat. I was good at it. I found bugs others missed. But the job title said "Manual Tester," and that phrase was starting to feel like a ceiling. The problem was not the work itself. The problem was that I had no idea what came next. Every career guide I found was either too vague ("learn automation") or too specific to be useful ("become an SDET at a FAANG company in 18 months"). Neither matched my reality.
So I figured it out the hard way. Three years later, I work as a Quality Assurance Engineer doing manual testing, automation, API validation, and CI/CD integration. Here is the roadmap I wish someone had handed me on day one.
The Career Landscape in 2026
Before mapping a path, you need to understand where QA roles actually sit today.
| Role | Focus | Typical Tools | Salary Range |
|---|---|---|---|
| Manual Tester | Test execution, bug reporting | Jira, TestRail, browsers | Entry level |
| QA Engineer | Test strategy, manual + basic automation | Postman, Selenium/Playwright basics | Mid level |
| Quality Engineer | Full automation, CI/CD, test architecture | Playwright, API frameworks, Docker, Git | Senior level |
| SDET | Code-first testing, framework development | Same as dev stack + test frameworks | Senior to Staff |
| QA Lead/Manager | Team strategy, process, hiring | All of the above + leadership | Management |
The key insight: each step builds on the previous one. You do not abandon manual testing. You add layers on top of it.
Phase 1: Strengthen Your Foundation (Months 1 to 3)
If you are currently a manual tester, you already have the most underrated skill in QA: you know how to think about breaking software. That does not change. But you need to formalize some fundamentals.
Learn the command line
You will use a terminal every single day as a quality engineer. Start here:
# Navigate directories
cd ~/projects
ls -la
# Search for text in files
grep -r "error" ./logs/
# Check running processes
ps aux | grep node
# View recent file changes
find . -name "*.log" -mtime -1You do not need to master Linux administration. You need to be comfortable navigating, reading logs, and running scripts without a GUI.
Learn Git basics
Every codebase you test lives in Git. You need to:
# Clone a repository
git clone https://github.com/team/project.git
# Create a branch for your test scripts
git checkout -b qa/login-tests
# Stage, commit, push
git add .
git commit -m "add login test cases"
git push origin qa/login-tests
# Pull latest changes before testing
git pull origin mainUnderstanding branches, pull requests, and merge conflicts is not optional anymore. When a developer says "it works on my branch," you need to know what that means and how to check.
Understand HTTP and APIs
Before you can test APIs, you need to understand how they work.
Client (Browser/App)
|
| HTTP Request: GET /api/users/123
| Headers: Authorization: Bearer eyJhbG...
|
v
Server (API)
|
| HTTP Response: 200 OK
| Body: { "id": 123, "name": "Rumana", "role": "QA" }
|
v
Client renders the dataLearn the HTTP methods (GET, POST, PUT, DELETE), status codes (200, 201, 400, 401, 404, 500), headers, and request/response bodies. This knowledge is the foundation for everything that comes next.
Phase 2: API Testing (Months 3 to 6)
This is the single highest-impact skill you can add. API testing bridges manual and automated testing, and it immediately makes you more valuable.
Start with Postman
Send your first request:
Method: GET
URL: https://jsonplaceholder.typicode.com/posts/1Then add assertions:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
pm.test("Response has required fields", function () {
const json = pm.response.json();
pm.expect(json).to.have.property("id");
pm.expect(json).to.have.property("title");
pm.expect(json).to.have.property("body");
});
pm.test("Response time under 500ms", function () {
pm.expect(pm.response.responseTime).to.be.below(500);
});Build a CRUD test collection
Create a complete workflow that tests creating, reading, updating, and deleting a resource:
1. POST /posts (create) -> store the ID
2. GET /posts/:id (verify) -> confirm creation
3. PUT /posts/:id (update) -> modify the resource
4. GET /posts/:id (verify) -> confirm update
5. DELETE /posts/:id (delete) -> remove the resource
6. GET /posts/:id (verify) -> confirm 404This teaches you chaining, environment variables, and test design in one exercise.
Test error responses
This is where manual testing instincts shine. You already know to ask "what if the user does something wrong?" Now apply that to APIs:
Missing required field -> expect 400
Invalid data type -> expect 400
Non-existent resource -> expect 404
No auth token -> expect 401
Wrong user's data -> expect 403Phase 3: Test Automation (Months 6 to 12)
This is where most manual testers get stuck. They try to learn Selenium from a YouTube tutorial, get frustrated with flaky tests, and quit. Here is a better approach.
Pick one framework and commit
In 2026, I recommend Playwright with TypeScript. Here is why:
- Auto-wait eliminates most flaky test issues
- One command setup (
npm init playwright@latest) - Built-in parallel execution
- Excellent documentation and growing job market
Your first real test
import { test, expect } from '@playwright/test';
test('user can search for a product', async ({ page }) => {
await page.goto('https://demo-store.example.com');
// Type in the search box
await page.fill('[data-testid="search-input"]', 'wireless mouse');
// Click search
await page.click('[data-testid="search-button"]');
// Verify results appear
await expect(page.locator('.product-card')).toHaveCount(3);
// Verify first result contains search term
await expect(
page.locator('.product-card').first()
).toContainText('wireless mouse');
});Learn the Page Object Model
Once you have 10 or more tests, organize them:
// pages/login.page.ts
import { Page } from '@playwright/test';
export class LoginPage {
constructor(private page: Page) {}
async goto() {
await this.page.goto('/login');
}
async login(email: string, password: string) {
await this.page.fill('#email', email);
await this.page.fill('#password', password);
await this.page.click('#submit');
}
async expectError(message: string) {
await expect(
this.page.locator('.error-message')
).toHaveText(message);
}
}
// tests/login.spec.ts
import { test } from '@playwright/test';
import { LoginPage } from '../pages/login.page';
test('invalid credentials show error', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login('bad@email.com', 'wrongpass');
await loginPage.expectError('Invalid credentials');
});This is the pattern every team uses. Learn it early.
Phase 4: CI/CD and DevOps Basics (Months 12 to 18)
Your tests are only valuable if they run automatically. Learn to integrate them into the development pipeline.
Understand the pipeline
# Simplified CI pipeline
stages:
- lint # Code quality checks
- unit-test # Developer unit tests
- build # Application compiles
- api-test # Your Postman/Newman tests
- deploy-staging
- e2e-test # Your Playwright tests
- deploy-prodEach stage is a gate. If your API tests fail, the code does not deploy to staging. If your E2E tests fail, it does not reach production.
Run tests in CI
# GitHub Actions example
name: E2E Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test
- uses: actions/upload-artifact@v4
if: failure()
with:
name: test-results
path: test-results/Understanding this file makes you the person who can set up and maintain the test pipeline. That is a quality engineer, not just a tester.
Phase 5: Specialization (Months 18+)
At this point, you have a solid foundation. Now pick a direction based on your interests:
Performance testing. Learn k6 or JMeter. Understand load testing, stress testing, and how to read performance metrics. Security testing. Study OWASP Top 10. Learn to test for XSS, SQL injection, and authentication vulnerabilities. Mobile testing. Learn Appium for native app testing. Understand the differences between iOS and Android testing. Test architecture. Design test frameworks from scratch. Make decisions about test data management, parallel execution, and reporting.
You do not need all of these. Pick the one that aligns with the work you want to do and go deep.
Common Mistakes to Avoid
Trying to learn everything at once. I spent my first month jumping between Selenium, Cypress, Playwright, and Appium. I learned nothing well. Pick one tool per phase and commit. Skipping the fundamentals. If you do not understand HTTP status codes, your API tests will be meaningless. If you do not understand Git, you cannot collaborate on test code. The boring fundamentals are not optional.
Thinking automation replaces manual testing. It does not. Automation handles regression. Manual testing handles exploration, usability, and the edge cases that only a human would think to try. The best quality engineers do both. Waiting for permission. You do not need your manager to approve a career transition. Start learning on your own time. Automate one test in your current project. Show the results. The credibility follows the work.
The Timeline Is Not Fixed
I outlined this as an 18-month roadmap, but your pace will vary. Some people move through Phase 1 in two weeks because they already know the command line. Others spend six months on Phase 3 because automation is genuinely hard at first. The important thing is forward motion. Every week, you should be able to point to something you learned or built that you could not do the week before.
Manual testing is not a dead end. It is a starting point. The skills you built finding bugs, thinking about edge cases, and understanding user behavior are the foundation that makes everything else work. Now you are just adding tools to make that foundation more powerful.