title: QA Engineer
slug: qa-engineer
aliases:
  - Quality Assurance Engineer
  - Test Engineer
  - SDET
  - Quality Engineer
category: Technology
tags:
  - testing
  - quality-assurance
  - automation
  - test-strategy
  - risk-based-testing
difficulty: advanced
summary: >-
  Produces trustworthy information about software quality by designing the
  cheapest tests that find the most damaging bugs, automating the stable and
  exploring the unknown.
contributors:
  - soul-atlas
last_reviewed: null
provenance: ai-generated
created: '2026-06-26'
updated: '2026-06-26'
related:
  - slug: software-engineer
    type: adjacent
    note: shares the craft but inverts the optimism — professional doubt
  - slug: security-engineer
    type: adjacent
    note: applies the same adversarial how-does-this-break mindset to attackers
  - slug: site-reliability-engineer
    type: adjacent
    note: tests resilience and failure in production
  - slug: product-manager
    type: collaboration
    note: owns the acceptance criteria QA verifies against
  - slug: devops-engineer
    type: collaboration
    note: owns the CI pipelines QA automation runs in
  - slug: engineering-manager
    type: progression
    note: common leadership step for senior quality engineers
specializations:
  - Automation Engineer / SDET
  - Performance Test Engineer
  - Security Tester
  - Manual / Exploratory Tester
country_variants: []
sources:
  - title: Lessons Learned in Software Testing
    kind: book
  - title: Agile Testing
    kind: book
  - title: ISTQB Foundation Syllabus
    kind: standard
status: draft
reviewers: []
sections:
  - heading: Purpose
    markdown: >-
      A QA engineer exists because shipping software is a bet against the
      unknown, and

      someone has to make that bet honestly. The discipline is not about
      clicking

      buttons to find bugs; it is about producing trustworthy information about
      quality

      so the people who decide to ship are deciding with their eyes open. Code
      is

      written by optimists who tested the happy path; QA is the professional
      pessimist

      who asks "what did we not think of?" and answers with evidence. The cost
      of a

      defect rises by orders of magnitude the later it's found — and users will
      find,

      within hours, every state the team convinced itself wouldn't happen.
  - heading: Core Mission
    markdown: >-
      Give the team the truth about whether the software does what it should and

      fails safely when it can't — by designing the cheapest tests that find the
      most

      important bugs, automating what's stable, and exploring what isn't.
  - heading: Primary Responsibilities
    markdown: >-
      The visible work is finding bugs; the actual work is risk management and

      information. A QA engineer defines the test strategy for a feature or
      release;

      designs test cases from requirements, equivalence classes, and boundary
      analysis;

      runs exploratory sessions to find what scripted tests miss; builds and
      maintains

      automated suites across the test pyramid; triages and reports defects so
      they're

      reproducible and prioritized; advocates for testability and shifting left;
      owns

      the flaky-test problem; gates releases with a clear risk readout; and
      after

      incidents, asks why a class of bug escaped. The deepest part of the job is

      deciding what *not* to test, because exhaustive testing is impossible and

      attention is the scarcest resource.
  - heading: Guiding Principles
    markdown: >-
      - **Quality is information, not a gate.** Your product is a confident,
      evidence-
        backed answer to "what's the risk if we ship now?" The decision belongs to the
        team; the truth belongs to you.
      - **Testing shows the presence of bugs, never their absence.** (Dijkstra.)
      You
        can never prove software correct by testing, so spend effort where a bug would
        hurt most.
      - **Risk-based, not coverage-based.** Test where probability of failure
      times
        cost of failure is highest. A 1% feature with catastrophic failure outranks a
        high-traffic feature that degrades gracefully.
      - **Shift left, shift everywhere.** The cheapest bug is caught in the
      requirement
        or the unit test. Get into design reviews; don't wait for a build.
      - **Automate the regression, explore the new.** Machines are tireless at
      checking
        known behavior; humans are irreplaceable at discovering unknown behavior.
      - **A flaky test is worse than no test.** A suite people don't trust gets
      ignored,
        and then real failures hide in the noise. Quarantine and fix flakiness
        ruthlessly.
  - heading: Mental Models
    markdown: >-
      - **The test pyramid (and the ice-cream-cone anti-pattern).** Many fast,
      isolated
        unit tests at the base; fewer integration tests; a thin layer of slow E2E tests
        at the top. An inverted pyramid (mostly slow UI tests) is expensive, flaky, and
        slow to diagnose.
      - **The defect cost-escalation curve.** A bug's cost to fix roughly
      multiplies by
        10 at each stage it survives — requirement, design, code, test, production. This
        is the entire economic case for shifting left.
      - **Oracles.** How you *know* something is wrong: the spec, comparable
      products,
        user expectations, prior behavior, the docs. Naming the oracle keeps testing
        from being "feels off."
      - **Exploratory testing as simultaneous learning, design, and execution.**
        (Bach/Bolton.) You design the next test from what the last one taught you,
        steered by a charter rather than a fixed script.
  - heading: First Principles
    markdown: >-
      - You cannot test everything; the input space is effectively infinite, so
      every
        testing strategy is a sampling strategy — make the sampling deliberate.
      - The absence of a failing test is not evidence of correctness; it may be
        evidence the test was too weak.
      - A bug found is cheap; a bug shipped is expensive; a bug nobody can
      reproduce is
        the most expensive of all.
  - heading: Questions Experts Constantly Ask
    markdown: >-
      - What's the worst thing that could happen if this feature is wrong, and
      who
        gets hurt?
      - What did the developer assume that the user won't?

      - What are the boundaries, the empty cases, the nulls, the max values?

      - What happens under concurrency, slow networks, time-zone changes, and
        interruption?
      - Is this test checking behavior, or just re-asserting the implementation?

      - Why did this bug escape — what test or process would have caught it?
  - heading: Decision Frameworks
    markdown: >-
      - **Automate vs. test manually.** Automate stable, repetitive, high-value
        regression checks; test manually (and exploratorily) anything new, subjective,
        visual, or changing weekly. Automation pays back only if the feature outlives
        the maintenance cost.
      - **Risk-based prioritization.** Plot features on likelihood × impact;
      give the
        top quadrant deep testing, the bottom a smoke test, and document what you
        consciously chose not to cover.
      - **Pyramid placement.** For each check, push it to the cheapest level
      that can
        catch the bug — a unit test over an integration test over an E2E test.
      - **Block vs. ship-with-known-issues.** A bug blocks release if it
      threatens data
        integrity, security, money, or safety, or has no workaround; otherwise it ships
        logged with severity and a follow-up, because perfect is the enemy of shipped.
  - heading: Workflow
    markdown: >-
      1. **Understand the change and its risk.** Read the requirement, design,
      and
         diff. Ask what could break and who it affects.
      2. **Define strategy.** Decide what to test, at what level, manually vs.
         automated, and explicitly what's out of scope.
      3. **Design cases.** Derive from requirements, equivalence classes,
      boundaries,
         error paths, and the oracles you'll use to judge pass/fail.
      4. **Explore.** Time-boxed charter-driven sessions to find what scripts
      miss —
         odd sequences, interruptions, bad data.
      5. **Automate the keepers.** Promote stable, valuable checks into the
      suite at
         the right pyramid level; keep them fast and deterministic.
      6. **Triage defects.** Reproduce, isolate, and write a clear report
      (steps,
         expected, actual, environment, evidence) with severity and priority.
      7. **Report readiness and learn from escapes.** Summarize coverage, open
      risks,
         and a ship/no-ship recommendation in business terms; when a bug reaches
         production, run a blameless analysis and add the missing test — fix the class,
         not the instance.
  - heading: Common Tradeoffs
    markdown: >-
      - **Test coverage vs. release velocity.** More tests catch more bugs and
      slow
        every release; the right depth depends on the cost of the bug, not a coverage
        percentage.
      - **Automation investment vs. maintenance cost.** Automated suites pay
      back over
        time but rot with the UI; brittle E2E tests can cost more than the bugs they
        catch.
      - **Strict gates vs. team trust.** Block too much and you become the
      bottleneck
        everyone routes around; block too little and quality erodes — calibrate to real
        risk.
  - heading: Rules of Thumb
    markdown: >-
      - If a test is flaky, it's a bug — in the test or the system — not noise
      to
        retry past.
      - The bug you can't reproduce, you can't fix; spend the time to nail the
      repro.

      - Test the boundaries first; that's where the bugs live.

      - Severity is "how bad," priority is "how soon"; never conflate them.

      - A good bug report lets a developer reproduce it without talking to you.

      - Measure escaped defects, not bugs found; the ones that got past you
      matter
        more.
  - heading: Failure Modes
    markdown: >-
      - **The flaky-suite death spiral.** Intermittent failures get "retried"
      until
        the team ignores red, and a real regression sails through unseen.
      - **Counting instead of judging.** Reporting "847 test cases passed"
      instead of
        "the payment path is high-risk and under-tested."
      - **Testing the implementation, not the behavior.** Tests so coupled to
      internals
        that any refactor breaks them, punishing exactly the cleanup you want.
  - heading: Anti-patterns
    markdown: >-
      - **Happy-path-only testing** — verifying the demo works, ignoring the
      error and
        edge cases where users live.
      - **Bug reports as accusations** — "it doesn't work" with no steps,
      environment,
        or evidence.
      - **Sleep-based synchronization** — `sleep(5)` in tests, the number-one
      source of
        flakiness and slowness.
      - **Shared mutable test data** — tests that pass alone and fail together
      because
        they trample each other's state.
      - **Coverage as a goal** — chasing 100% line coverage with assertion-free
      tests
        that prove nothing.
  - heading: Vocabulary
    markdown: >-
      - **Test pyramid** — the ratio of many unit, fewer integration, few E2E
      tests.

      - **Flaky test** — a test that passes and fails on the same code, non-
        deterministically.
      - **Exploratory testing** — simultaneous learning, test design, and
      execution,
        steered by a charter.
      - **Severity vs. priority** — how damaging a bug is vs. how urgently to
      fix it.

      - **Equivalence partition / boundary value** — input classes and their
      edges, the
        prime hunting ground for bugs.
      - **Shift-left** — moving testing earlier into design and development.

      - **Regression** — a previously working behavior that a change broke.

      - **Test double (mock/stub/fake/spy)** — stand-ins that isolate the unit
      under
        test.
  - heading: Tools
    markdown: >-
      - **Selenium / Playwright / Cypress** — browser automation; Playwright and
        Cypress favored now for speed and auto-waiting over sleeps.
      - **Appium / Espresso / XCUITest** — mobile UI automation.

      - **JUnit / pytest / Jest / TestNG** — unit and integration test runners.

      - **Postman / REST-assured / k6** — API functional and load testing.

      - **Jenkins / GitHub Actions / GitLab CI** — to run suites on every
      change.

      - **JIRA / TestRail / Zephyr** — defect tracking and test-case management.

      - **BrowserStack / Sauce Labs** — device and browser farms for the matrix.
  - heading: Collaboration
    markdown: >-
      QA sits at the seam between what was promised and what was built, working
      with

      developers (who must see QA as a partner, not an adversary), product
      managers

      (who own acceptance criteria and risk appetite), designers, and
      operations. The

      healthiest pattern is QA in the room at requirement and design time,
      asking "how

      will we test this?" before a line is written — that question alone
      improves the

      design. Bug reports are a communication craft: precise, reproducible,
      blame-free,

      with evidence. The recurring friction is the developer-QA dynamic; the
      cure is

      shared ownership and a culture where finding a bug is a team win. The best
      QA

      engineers make developers better testers and put themselves slowly out of
      the

      bug-finding business.
  - heading: Ethics
    markdown: >-
      QA is often the last person who can say "this isn't safe to ship" before
      users

      are exposed — a quiet ethical responsibility. Core duties: report risk
      honestly

      even when it's unwelcome and the deadline is tomorrow; never sign off on
      something

      you haven't actually verified; protect users by testing accessibility,
      privacy,

      and security paths, not just features that demo well; refuse to bury a
      known

      severe defect for schedule's sake without an accountable owner deciding
      openly;

      and never copy production PII into insecure test environments. The hardest
      moments

      are when business pressure wants a "looks tested" sign-off — integrity
      means

      stating the risk clearly and letting the accountable owner decide on the
      record.
  - heading: Scenarios
    markdown: >-
      **A login bug that "can't be reproduced."** Developers keep closing a
      report of

      intermittent login failures as irreproducible. The expert treats
      intermittent as

      a clue and finds the failures correlate with users in time zones where the
      local

      date is already "tomorrow" relative to the server. The token expiry check

      compares a client timestamp to a server one without normalizing to UTC, so
      it

      intermittently rejects valid tokens around midnight. Now reproducible by
      setting

      the device clock, it's fixed in minutes — and the expert adds boundary
      tests for

      midnight, year-end, and DST, the whole untested class.


      **A test suite nobody trusts.** A team's CI is red half the time, and
      engineers

      just hit "re-run." The expert treats this as the top quality problem,
      because a

      suite you ignore is worse than none. They quarantine the worst offenders
      (with

      tickets and owners) and trace the root cause to `sleep()`-based waits and
      tests

      sharing an un-isolated database. They replace sleeps with explicit

      wait-for-condition, give each test its own transactional fixture, and
      restore the

      rule that red means stop. The next real regression gets caught.


      **Risk-based triage under a hard deadline.** A release is due Friday with
      40 open

      bugs and no time to fix all. The expert sorts by risk: a data-corruption
      bug in

      billing and a security issue in password reset are blockers (catastrophic,
      no

      workaround); a misaligned icon and a typo ship logged; a slow report
      export gets

      a documented workaround and a fast-follow ticket. They write a one-page
      readiness

      summary — "two blockers must fix, six ship with workarounds, the rest
      cosmetic" —

      and hand the ship decision to the product owner with the risks named, so
      the team

      ships informed, not blind.
  - heading: Related Occupations
    markdown: >-
      A QA engineer shares the software engineer's craft but inverts the
      optimism:

      where developers build, QA professionally doubts. They overlap heavily
      with SDETs

      and automation engineers who write the test code, and with site
      reliability

      engineers who test resilience in production. Security engineers apply the
      same

      adversarial "how does this break?" mindset to attackers. Product managers
      own the

      acceptance criteria QA verifies against. Mobile and embedded developers
      depend on

      QA's discipline for device and lifecycle matrices that are murder to cover
      by hand.
  - heading: References
    markdown: |-
      - *Lessons Learned in Software Testing* — Kaner, Bach, Pettichord
      - *Agile Testing* — Lisa Crispin & Janet Gregory
      - *Explore It!* — Elisabeth Hendrickson
      - ISTQB Foundation Syllabus — istqb.org
      - *The Practical Test Pyramid* — Ham Vocke (martinfowler.com)
