Skip to main content
Back to Blog
Career
2026-05-21

SDET Roadmap Day-by-Day 90 Day Plan for 2026

A day-by-day 90-day plan to become a Software Development Engineer in Test. Daily learning objectives, exercises, projects, and milestones to land your first SDET role.

SDET Roadmap Day-by-Day 90 Day Plan for 2026

The Software Development Engineer in Test (SDET) role has become one of the most demanded and well-compensated specializations in QA over the last five years. Companies hire SDETs to do what traditional manual testers can't: write production-grade test code, automate at scale across UI, API, and data layers, integrate test pipelines into CI, and contribute to test infrastructure and frameworks. The path from manual tester or junior developer to SDET is steep but well-defined.

This guide presents a 90-day plan to acquire core SDET skills, build a portfolio, and prepare for SDET interviews. It assumes you start with basic programming knowledge (loops, conditionals, functions in any language) and the willingness to commit 2-3 hours per day. The plan covers Python or Java fundamentals, web automation with Playwright or Selenium, API testing, CI/CD, performance testing fundamentals, and interview preparation. Each day has specific learning objectives and exercises. For other career paths see QA Engineer vs SDET vs Test Architect and browse the skills directory for curated AI agent skills.

Phase Overview

The 90 days split into three phases. Days 1-30 build programming and automation fundamentals. Days 31-60 build framework skills and a portfolio project. Days 61-90 cover advanced topics, interview prep, and applications. Adjust the pace to your background; absolute beginners might extend each phase by 30%.

PhaseDaysFocusOutput
Foundation1-30Programming, basic web/API automation3 small projects
Framework31-60Page Object Model, CI, scalable patternsPortfolio project
Mastery61-90System design, advanced topics, interviewsJob-ready

Phase 1: Foundation (Days 1-30)

Days 1-7: Programming Fundamentals

Pick one language and stick to it. Python and Java are the most demanded in SDET roles. JavaScript/TypeScript is growing rapidly. Pick the one most used in your target industry.

DayTopicExercise
1Setup environment, hello world, variablesSolve 5 easy LeetCode problems
2Lists, dicts, control flowBuild a number guesser CLI
3Functions, modulesRefactor day 2 into modules
4Classes and OOPBuild an inventory system class
5Exception handlingAdd error handling to day 4
6File I/O and JSONRead/write a JSON config
7Mini-project: Todo CLIBuild a CLI with add/list/done

By end of week 1 you should be comfortable writing 50-line programs without reference.

Days 8-14: Web Automation Basics

# Day 8: First Playwright script
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://practice.qaskills.sh")
    page.fill("#email", "demo@example.com")
    page.click("button[type=submit]")
    assert page.url.endswith("/dashboard")
    browser.close()
DayTopicExercise
8Install Playwright, first page navigationNavigate to 3 sites, take screenshots
9Selectors: CSS, text, roleFind 10 elements by different selectors
10Form filling, clicksAutomate a login form
11Assertions and waitsAdd assertions to day 10
12Multiple pages, tabsTest a multi-page checkout flow
13Screenshots, videos, tracesCapture and review a failure
14Mini-project: Login + dashboard testWorking end-to-end test

Days 15-21: API Testing

# Day 15: First API test with pytest + requests
import requests

def test_get_users():
    response = requests.get("https://api.example.com/users")
    assert response.status_code == 200
    users = response.json()
    assert isinstance(users, list)
    assert len(users) > 0

def test_create_user():
    response = requests.post(
        "https://api.example.com/users",
        json={"name": "Alice", "email": "alice@example.com"}
    )
    assert response.status_code == 201
    assert response.json()["id"] is not None
DayTopicExercise
15HTTP fundamentals, GET requestsTest 3 public APIs
16POST, PUT, DELETEBuild a CRUD test for a mock API
17Status codes, headersVerify response headers and status
18JSON parsing and assertionsAssert specific JSON fields
19Auth: API keys, Bearer tokensTest an auth-protected endpoint
20Test data setup and teardownCreate and clean up test data
21Mini-project: REST API test suite20+ tests for a public API

Days 22-30: pytest and Test Organization

# Day 22: First pytest fixture
import pytest

@pytest.fixture
def authenticated_client():
    client = ApiClient()
    client.login("user@example.com", "demo")
    yield client
    client.logout()

def test_get_profile(authenticated_client):
    response = authenticated_client.get("/profile")
    assert response.status_code == 200
DayTopicExercise
22pytest fixturesRefactor day 21 with fixtures
23pytest parametrizeAdd data-driven tests
24pytest markers and selectionTag tests, run subsets
25conftest.py and shared fixturesCentralize fixtures
26Test reports (HTML, Allure)Generate reports
27Mocking with unittest.mockMock external services
28Code coverage with pytest-covMeasure coverage
29-30End-of-phase 1 portfolio refactorPolish 3 projects on GitHub

Phase 2: Framework (Days 31-60)

Days 31-37: Page Object Model

Move from script-style tests to structured frameworks.

# Day 31: First Page Object
class LoginPage:
    def __init__(self, page):
        self.page = page
        self.email_input = page.locator("#email")
        self.password_input = page.locator("#password")
        self.submit_button = page.locator("button[type=submit]")

    def navigate(self):
        self.page.goto("https://practice.qaskills.sh/login")
        return self

    def login(self, email, password):
        self.email_input.fill(email)
        self.password_input.fill(password)
        self.submit_button.click()
        return DashboardPage(self.page)
DayTopicExercise
31Page Object pattern introBuild LoginPage
32Inheriting BasePageBuild 3 pages
33Fluent return-self patternChain page actions
34Component objectsExtract a Header component
35Locator strategiesReplace brittle selectors
36Page assertions vs test assertionsDecide where logic lives
37Refactor portfolio: POMApply to login + checkout

Days 38-44: Test Data and Configuration

DayTopicExercise
38Config files (JSON, YAML, env)Externalize URLs and creds
39Test data: fixtures vs buildersBuild a user factory
40Faker.js / Python FakerGenerate random test data
41Database setup for testsSeed and clean a DB
42Test isolation strategiesEach test in its own state
43Parallel-safe test designRun tests in parallel
44Refactor portfolio: dataMake data-driven

Days 45-51: CI/CD Integration

DayTopicExercise
45Git fundamentals refresherClean branch workflow
46GitHub Actions basicsFirst workflow that runs lint
47Workflow for running pytestCI runs tests on push
48Caching dependenciesSpeed up CI
49Matrix strategy: multi-browserRun on Chrome and Firefox
50Publishing test reportsAllure or HTML in artifacts
51Refactor portfolio: CIGreen CI on every push

Days 52-60: Build Portfolio Project

A real portfolio project demonstrates everything together. Pick a public website with rich functionality (a demo e-commerce site, a SaaS dashboard, etc.) and build a comprehensive test suite.

my-sdet-portfolio/
├── README.md
├── pyproject.toml
├── pytest.ini
├── .github/workflows/ci.yml
├── conftest.py
├── tests/
│   ├── ui/
│   │   ├── test_login.py
│   │   ├── test_search.py
│   │   ├── test_checkout.py
│   │   └── test_account.py
│   ├── api/
│   │   ├── test_products.py
│   │   └── test_orders.py
│   └── integration/
│       └── test_e2e_purchase.py
├── pages/
│   ├── base_page.py
│   ├── login_page.py
│   └── ...
├── utils/
│   ├── api_client.py
│   ├── data_factory.py
│   └── config.py
└── data/
    ├── users.json
    └── products.csv

Spend days 52-60 building this. Document everything in the README. Include CI badge, coverage badge, screenshots. This becomes your interview talking piece.

Phase 3: Mastery (Days 61-90)

Days 61-67: Performance Testing Basics

// Day 61: First k6 script
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  vus: 10,
  duration: '30s',
  thresholds: {
    http_req_duration: ['p(95)<500'],
  },
};

export default function () {
  const res = http.get('https://api.example.com/products');
  check(res, { 'status 200': (r) => r.status === 200 });
  sleep(1);
}
DayTopicExercise
61k6 install, first scriptTest a public API
62Thresholds and SLOsAdd SLO-based pass/fail
63Stages and rampingBuild a realistic ramp
64Scenarios and arrival rateOpen vs closed model
65Result analysisRead p95, p99
66k6 in CIAdd to portfolio
67Mini-project: load test API5+ scenarios

Days 68-74: Advanced Topics

DayTopicExercise
68Mocking services (MSW, WireMock)Mock a backend
69Contract testing (Pact)Provider-consumer test
70Visual regression (Playwright snapshots)Add to portfolio
71Accessibility (axe-core)Audit a page
72Mobile basics (Appium intro)First Appium script
73Docker for testsContainerize test runs
74Kubernetes basicsDeploy a test job

Days 75-81: System Design and Architecture

DayTopicExercise
75Test pyramid revisitedDocument portfolio's pyramid
76When to test at each layerJustify decisions
77Test environment strategiesDocument staging vs prod
78Data management at scaleDesign test data flow
79Parallel execution patternsOptimize portfolio run time
80Flaky test managementIdentify and fix 3 flakies
81Practice: design a test strategyWrite a 5-page doc

Days 82-90: Interview Prep and Applications

DayTopicExercise
82Resume polishApply resume template
83LinkedIn optimizationUpdate profile
84Mock interview: codingLeetCode easy/medium
85Mock interview: SDET-specificSee mock interview
86Behavioral prepSee behavioral interview
87System design prepSee system design interview
88-89Apply to 20 positionsNetworking + applications
90Reflect and continuePlan next 90 days

Resume Bullet Examples

After 90 days, sample resume bullets you can write:

  • "Built end-to-end test framework using Python, Playwright, and pytest covering 80+ scenarios with parallel execution in CI"
  • "Achieved 95% test reliability by implementing explicit waits, retry policies, and proper test isolation patterns"
  • "Designed Page Object Model architecture reducing duplication 60% and cutting maintenance time per feature"
  • "Implemented k6 performance test suite for REST APIs with SLO-backed thresholds and CI pipeline integration"
  • "Integrated test pipelines with GitHub Actions matrix strategy running Chrome and Firefox in parallel"

Common Pitfalls

Five mistakes 90-day SDET students make:

  1. Trying too many tools. Pick one stack and go deep. You can always learn alternatives later.
  2. No portfolio. Without a GitHub repo with real code, your resume is just claims.
  3. Skipping CI. SDETs live in CI. Without CI experience you're a tester who codes, not an SDET.
  4. Not networking. 70% of jobs are filled through referrals. Network from day 1.
  5. Quitting at day 85. The last week of interviews and applications matters most. Push through.

Salary Expectations

Entry-level SDET salaries vary significantly by region:

RegionJunior SDET (0-2 yrs)Mid SDET (2-5 yrs)Senior SDET (5+ yrs)
US (SF/NYC)$90k-$130k$130k-$180k$180k-$250k
US (other)$70k-$110k$100k-$140k$130k-$200k
EU (London)£45k-£70k£70k-£100k£100k-£140k
IndiaINR 8-15LINR 15-30LINR 30-60L
Remote (US-based)$80k-$120k$120k-$160k$160k-$220k

For more on roles see QA Engineer vs SDET vs Test Architect.

Conclusion

The 90-day SDET plan is intense but achievable for committed learners. The key is daily progress and a tangible portfolio. By day 90 you should have three GitHub projects, a polished CI pipeline, a portfolio website or LinkedIn presence, and 20+ applications in flight.

Browse the skills directory for AI agent skills that accelerate your learning. Read the related SDET mock interview questions, test automation engineer resume template, and test architect roadmap for next steps.

SDET Roadmap Day-by-Day 90 Day Plan for 2026 | QASkills.sh