
Written by: Chief Technology Officer
Dmitry ReznikPosted: 04.05.2026
24 min read
A software bug caught during development costs roughly 6× less to fix than one found in production, and 100× less than one that causes a live incident. Yet most engineering teams still treat QA as a final gate rather than a continuous discipline built into the way they work every day.
We've led QA engagements across 500+ projects, for startups scaling their first product, for enterprises like Abbott and Tipalti running mission-critical software, and for fintech platforms where a single defect can trigger regulatory consequences. In that time, I've watched smart teams ship bad software because they skipped the fundamentals, and I've watched lean teams punch above their weight because they had the right process habits in place.
This guide distills the 20 QA best practices that actually move the needle, not theory, but operational habits refined in real projects. Each one includes implementation steps, a common mistake to avoid, and a tool recommendation where relevant.
Quick reference: All 20 QA best practices at a glance
Use this table to orient your team before diving into each practice. The 'Phase' column shows where in your SDLC each practice has the most impact.
Shift-left testing
Testing strategy
Requirements / Design
Jira, Confluence
Risk-based testing
Testing strategy
Planning
Risk matrix (custom)
Clear, testable requirements
Process
Pre-development
Confluence, Notion
Continuous testing in CI/CD
Automation
Dev → Deploy
Jenkins, GitHub Actions
Automate regression strategically
Automation
Dev / Integration
Selenium, Playwright, Cypress
Integrate risk management
Process
All phases
JIRA, custom risk log
Cover the full SDLC
Culture / process
All phases
TestRail, Zephyr
Build a quality-first culture
Culture
Ongoing
N/A
Formulate concise requirements
Process
Pre-development
Confluence
Enforce security testing
Testing coverage
Dev → Deploy
OWASP ZAP, Burp Suite
Maintain a test case repository
Documentation
All phases
TestRail, qTest
Use mature, defined processes
Process
All phases
ISO 9001 / ISTQB
Comply with industry standards
Compliance
All phases
Varies by vertical
Conduct exploratory testing
Testing type
Integration / UAT
Session-based templates
Practice close dev–QA collaboration
Culture
All phases
Slack, Jira, daily stand-ups
Adopt an end-user mindset
Testing strategy
UAT / Post-deploy
FullStory, Hotjar
Track QA metrics and KPIs
Measurement
Ongoing
Datadog, custom dashboards
Maintain QA post-release
Process
Post-deployment
Sentry, PagerDuty
Is your QA process structured, or reactive? Most teams we engage have gaps in at least 3 of these 20 areas. We can help you find and fix them.
Book a free QA process review
The 20 Software quality assurance best practices
1. Shift testing left — start before the first line of code
Category: Testing strategy
When: Requirements & design
Shift-left testing means moving QA involvement to the earliest possible stage of the SDLC, requirements gathering and system design, rather than waiting until development is complete. Research consistently shows that defects found at the requirements phase cost 10–100× less to fix than those found in production.
Involve a QA engineer in requirement reviews and sprint planning meetings.
Write acceptance criteria for every user story before development begins.
Use 'three amigos' sessions (developer, QA, product owner) to align on expected behaviour before coding starts.
Build a checklist: Is this requirement testable? Is it unambiguous? Does it have measurable success criteria?
Common mistake: Treating shift-left as purely a developer habit. Developers writing unit tests is necessary but not sufficient, QA needs a seat at the requirements table, not just the code review.
Tool tip: Use Confluence or Notion to create requirement templates that include a 'testability' field. Jira workflows can enforce that acceptance criteria exist before a ticket moves to 'In Progress'.
2. Prioritise with risk-based testing
Category: Testing strategy
When: Sprint planning
You will never have time to test everything. Risk-based testing is the discipline of focusing your testing effort where the cost of failure is highest. This means scoring features and modules by probability of failure and business impact, then allocating test depth accordingly.
Create a risk matrix: score each feature area on Likelihood of Defect (1–5) and Business Impact (1–5). Multiply for a risk score.
Tier your testing: high-risk areas get full regression + exploratory; medium-risk get scripted tests; low-risk get smoke tests only.
Revisit the risk matrix at the start of each sprint, risk profiles change as the product evolves.
Involve product and business stakeholders. They know which failure modes are commercially catastrophic.
Common mistake: Treating all test cases equally and running the full regression suite on every build regardless of change scope. This is why release cycles slow down as products grow.
Tool tip: Maintain your risk matrix in a shared spreadsheet or Jira custom fields. For regulated industries (fintech, healthcare), map risk tiers to compliance requirements.
3. Define clear, testable requirements from the start
Category: Process
When: Pre-development
Good QA starts upstream. Vague requirements, 'the system should be fast', 'the UI should be intuitive', are untestable and create the conditions for defects. Every requirement entering development should be specific, measurable, and agreed upon by QA, development, and the product owner.
Replace vague criteria with measurable ones: 'response time < 200ms at p95 under 1,000 concurrent users'.
Use Given/When/Then (BDD) format for acceptance criteria on complex user flows.
Flag requirements that lack a clear pass/fail condition before they enter the sprint.
Maintain a requirement traceability matrix — every test case should trace back to a requirement.
Common mistake: Writing requirements that describe implementation rather than behaviour. 'The button uses a POST request' is an implementation detail; 'clicking Submit saves the form and redirects to the confirmation page within 2 seconds' is a testable requirement.
Tool tip: Tools like Cucumber or SpecFlow support BDD-style acceptance criteria that double as automated test definitions.
4. Build continuous testing into your CI/CD pipeline
Category: Automation
When: Development through deployment
Continuous testing means automated tests run on every code commit, not just nightly or before release. When integrated into a CI/CD pipeline, it provides immediate feedback to developers and prevents defects from accumulating across branches. This is the backbone of any modern DevOps or Agile QA operation.
Set up pipeline stages: unit tests on commit → integration tests on PR → regression suite on merge to main → smoke tests on deploy.
Keep the CI test suite fast (under 10 minutes for unit + integration). Slow pipelines get bypassed.
Gate deployments: a failed test suite blocks promotion to staging or production.
Track test flakiness, unreliable tests erode trust in the pipeline and get ignored.
Common mistake: Treating CI/CD testing as a replacement for manual QA rather than a complement. Automated pipelines catch regressions efficiently; exploratory and UX issues still require human testing.
Tool tip: Jenkins, GitHub Actions, and CircleCI all support multi-stage test pipelines. For test reporting, Allure or ReportPortal gives teams visibility into test trends over time.
5. Automate regression testing — strategically, not universally
Category: Automation
When: Development & integration
Test automation is not binary – the goal is not 100% automation coverage, it is the right coverage. A practical benchmark: 70–80% automation for regression and smoke tests is achievable and sustainable. Attempting to automate everything creates brittle test suites that cost more to maintain than they save.
Automate: regression tests for stable features, smoke tests, data-driven scenarios, API contract tests.
Keep manual: exploratory testing, usability assessments, tests for features under active development.
Apply the automation pyramid: many unit tests, fewer integration tests, minimal UI tests.
Review and retire automated tests regularly, tests for deprecated features are dead weight.
Common mistake: Automating UI tests first because they are the most visible. UI tests are the most brittle and expensive to maintain. Start with unit and API tests where stability is highest.
Tool tip: Selenium and Playwright for browser automation; Cypress for modern web apps; Appium for mobile. For API testing, Postman or RestAssured.
6. Integrate risk management as a core QA activity
Category: Process
When: All phases
Most teams treat risk management as a project management concern. In practice, QA is one of the most effective risk management tools an engineering organisation has. Risk management in QA means proactively identifying, assessing, and mitigating quality risks before they materialise as defects, not cataloguing them after incidents occur.
At the project kick-off, run a risk workshop: What could go wrong? What are the highest-impact failure modes?
Maintain a living risk register linked to your test plan, each risk should have a corresponding test case.
Review the risk register at the start of each sprint and after major releases.
Track risk realisation: when a defect escapes to production, trace it back to the risk register. Was it a known risk that wasn't mitigated, or a blind spot?
Common mistake: Treating QA risk management as paperwork for compliance audits rather than an operational discipline. A risk register that's updated once a quarter is not risk management.
7. Ensure QA coverage across the full SDLC
Category: Culture / process
When: All phases
Quality assurance that only activates at the testing phase is quality control, not quality assurance. True QA spans all phases: it influences how requirements are written, how architecture is designed, how code is reviewed, how releases are managed, and how user feedback is processed after deployment.
Create a QA touchpoint checklist for each SDLC phase and make it part of your Definition of Done.
QA should sign off on architecture decisions that affect testability — e.g., logging design, environment parity.
Include QA in post-mortems. Understanding why a defect escaped is as valuable as fixing it.
Common mistake: Assuming that a dedicated test phase at the end of the sprint is enough. By that point, the cost to fix critical defects has already risen significantly.
Tool tip: TestRail or Zephyr for test lifecycle management across SDLC phases.
8. Build a quality-first culture — QA is everyone's responsibility
Category: Culture
When: Ongoing
In high-performing engineering teams, quality is not the QA team's sole responsibility, it's a shared value. Developers write unit tests before marking tickets done. Product owners write testable acceptance criteria. DevOps engineers build monitoring into release pipelines. QA acts as the facilitator and gatekeeper of this shared standard, not the only person who cares about it.
Include quality criteria in your engineering onboarding, make expectations explicit from day one.
Celebrate defect prevention as much as defect discovery, reward the developer who caught a bug in peer review.
Run joint QA retrospectives with the full squad: what broke, why, and what process change prevents it next time.
Make quality metrics visible to the whole team, not just QA leads.
Common mistake: Siloing quality responsibility in the QA team. When developers see defects as 'QA's problem to find', defect rates rise and release cycles lengthen.
9. Document requirements concisely and maintain traceability
Category: Process
When: Pre-development
Requirements documentation is not bureaucracy — it is the contract between what the business needs and what engineering builds. Requirements that are ambiguous, undocumented, or stored only in people's heads are a primary source of quality failures. Traceability means every test case can be linked to a requirement, and every defect can be traced to a missed or misunderstood requirement.
Use a consistent template: ID, title, description, acceptance criteria, priority, and test reference.
Store requirements in a tool that links to your test management system — Jira + TestRail integration is a common pattern.
Review requirements for testability at sprint planning. Any requirement without a measurable acceptance criterion does not go into development.
Common mistake: Over-documenting. A 40-page requirements specification that nobody reads is worse than a concise, well-maintained backlog. Aim for clarity, not volume.
Tool tip: Confluence for requirements documentation. Jira for traceability between requirements, test cases, and defects.
10. Make performance testing a release gate, not an afterthought
Category: Testing coverage
When: Integration & pre-production
Performance issues discovered after a product launch are expensive, damaging to reputation, and often avoidable. Performance testing, covering load, stress, scalability, and endurance, should be part of the release checklist for any software that will serve concurrent users or process significant data volumes.
Define performance benchmarks early: 'p95 response time < 500ms at 5,000 concurrent users'.
Run load tests in a staging environment that mirrors production (same infrastructure, same data volume).
Include a soak test (sustained load over 12–24 hours) before major releases to catch memory leaks.
Baseline after every release, compare performance trends sprint over sprint, not just against an absolute threshold.
Common mistake: Running a one-off load test before the first major release and never again. Performance profiles change as products evolve, data grows, and infrastructure changes.
Tool tip: k6 and Apache JMeter are widely used open-source options. LoadRunner for enterprise-scale performance testing.
11. Embed security testing throughout development
Category: Testing coverage
When: Development through deployment
Security is not a penetration test ordered six weeks before launch, it's a continuous practice. Modern QA programmes integrate security testing at multiple levels: static code analysis in the CI pipeline, dynamic application security testing (DAST) in staging, and formal penetration testing at major milestones.
Add SAST (Static Application Security Testing) to your CI pipeline, it runs on every commit.
Include OWASP Top 10 scenarios in your test plan for any web-facing application.
Run DAST tools against staging before each production release.
Schedule formal penetration testing at least annually, or before major launches in regulated verticals.
Common mistake: Treating a passing penetration test as a security clearance. A pen test is a point-in-time assessment. Security testing needs to be continuous to be effective.
Tool tip: OWASP ZAP (free, open source) for DAST. Snyk or SonarQube for SAST in CI/CD pipelines.
12. Maintain a centralised, well-organised test case repository
Category: Documentation
When: All phases
A disorganised or absent test case library means knowledge lives in individuals, not the team. When someone leaves, test coverage degrades. A centralised repository ensures repeatability, enables accurate test progress tracking, and makes onboarding new QA engineers significantly faster.
Organise test cases by feature area, priority, and type (smoke / regression / exploratory).
Tag test cases by requirement ID for traceability.
Review and update test cases after each release, outdated tests are worse than no tests because they create false confidence.
Track test execution results over time, test trends reveal quality regressions before users do.
Common mistake: Creating exhaustive test case libraries that nobody maintains. A lean, maintained repository of 500 relevant tests is more valuable than 5,000 outdated ones.
Tool tip: TestRail, Zephyr, or qTest for test management. All integrate with Jira for end-to-end traceability.
13. Define and follow mature, consistent QA processes
Category: Process
When: All phases
Process consistency is what separates teams that occasionally deliver quality from teams that reliably deliver quality. A mature QA process is documented, followed, and periodically audited, not improvised sprint by sprint. This includes test planning, defect lifecycle management, release readiness criteria, and retrospective processes.
Document your QA process: what happens at each SDLC phase, who is responsible, and what constitutes done.
Use a Definition of Done that includes QA criteria, test cases written, automated regression passing, exploratory session complete.
Conduct quarterly QA process audits: are teams actually following the defined process, and is the process still fit for purpose?
Common mistake: Documenting processes for compliance rather than operational value. If your QA process documentation only gets read during audits, it's not a real process.
14. Comply with relevant industry standards — and prove it
Category: Compliance
When: All phases
In regulated industries, healthcare, fintech, automotive, aviation, compliance with quality standards is not optional. But beyond legal obligation, standards like ISO 9001, ISO 27001, and ISTQB certification provide a structured quality framework that improves outcomes even in unregulated contexts. The ability to demonstrate compliance is increasingly a commercial differentiator in B2B sales.
Identify which standards apply to your product and vertical (HIPAA, PCI-DSS, SOC 2, GDPR, ISO 13485 for medical devices).
Map your QA process to the relevant standard's requirements, many have direct implications for testing documentation and traceability.
Build audit trails into your QA toolchain, test execution logs, defect histories, and sign-off records.
Obtain relevant certifications where they provide commercial value, ISTQB for QA engineers, ISO 9001 for organisational quality systems.
Common mistake: Treating compliance as a documentation exercise performed immediately before an audit. Compliance-ready QA is a daily operational discipline.
15. Leverage AI-assisted testing to scale coverage
Category: Automation
When: Development through deployment
AI is changing what is possible in QA. Modern AI testing tools can generate test cases from requirements, identify high-risk areas in the codebase based on change frequency and historical defect data, run self-healing automated tests that adapt to UI changes, and detect visual regressions at pixel level. These capabilities do not replace human QA judgment, they extend it.
Use AI-powered test generation to create initial test cases from user stories, treat these as a starting point to review, not a finished product.
Apply predictive defect analysis: tools that analyse code change patterns to identify where bugs are most likely to appear.
Deploy visual AI testing for UI-heavy applications, catch pixel-level regressions that scripted tests miss.
Implement self-healing test automation to reduce the maintenance burden of UI test suites.
Common mistake: Over-trusting AI-generated test cases. AI tools identify test scenarios based on patterns, not business context. A human QA engineer must review and curate AI-generated test cases.
Tool tip: Testim, Mabl, and Applitools are leading AI-assisted testing platforms. Applitools Ultrafast Grid is particularly effective for cross-browser visual testing.
16. Run structured exploratory testing sessions
Category: Testing type
When: Integration & UAT
Automated testing catches what you told it to look for. Exploratory testing catches what you didn't anticipate. It leverages the QA engineer's experience, intuition, and creative thinking to find defects that scripted tests miss, edge cases, unexpected user paths, interaction effects between features. A well-run exploratory testing programme is one of the highest-ROI activities in a QA budget.
Use session-based exploratory testing: define a charter (what area to explore, what risks to target), set a timebox (60–90 minutes), and document findings.
Rotate exploratory sessions across different team members, fresh eyes catch different issues.
Prioritise exploratory testing for new features, recently refactored areas, and any module with a history of defects.
Log exploratory findings as formal defects, they should feed back into the risk register and test case repository.
Common mistake: Running exploratory testing with no structure and calling the results 'ad hoc'. Unstructured exploration wastes time and produces inconsistent results. The session-based charter model maintains rigour without losing flexibility.
17. Close the gap between development and QA
Category: Culture
When: All phases
The adversarial model, developers throw code over the wall, QA throws defects back, is a relic. High-velocity teams treat QA and development as a continuous feedback loop. QA engineers understand the codebase well enough to write meaningful test cases. Developers understand the test suite well enough to write testable code. Both participate in sprint ceremonies and share accountability for release quality.
Include QA in sprint planning, backlog refinement, and retrospectives, not just testing phases.
Pair QA engineers with developers during complex feature development, shift defect prevention further left.
Create shared quality dashboards visible to both dev and QA, align both teams on the same metrics.
Establish clear escalation paths: when a defect is found, how quickly must it be triaged? Who decides if a release is blocked?
Common mistake: Measuring QA productivity by defect count. A QA team that finds many defects is a symptom of problems upstream. A high-performing QA team finds defects early or prevents them entirely, which means the raw defect count goes down, not up.
18. Test through the eyes of the end user
Category: Testing strategy
When: UAT & post-deployment
Technical correctness is necessary but not sufficient. Software can pass every functional test and still fail users, because flows are confusing, error messages are cryptic, performance degrades under real-world data, or edge cases that seemed unlikely are actually common. QA engineers who maintain an active end-user perspective catch a different class of defect than those who test against specifications alone.
Include usability and UX testing in your test plan, not just functional validation.
Use real user data patterns (anonymised) to construct test scenarios. Production user behaviour often differs significantly from assumed behaviour.
Run UAT with actual users or product owners, not just internal stakeholders who know the product too well.
Review support tickets and user feedback loops for patterns, recurring user complaints are defects that your test suite missed.
Common mistake: Substituting UAT with an internal demo. Stakeholders who built the product will use it as intended. Real users will not.
Tool tip: Session replay tools like FullStory or Hotjar reveal how real users interact with your product, invaluable for shaping exploratory test sessions.
19. Define and track QA metrics and KPIs
Category: Measurement
When: Ongoing
You cannot improve what you do not measure. QA without metrics is an activity; QA with metrics is a discipline. The right KPIs give engineering leaders visibility into where quality is improving, where it is degrading, and what to prioritise. They also make the business case for QA investment, nothing silences budget objections faster than a chart showing the cost-per-defect trending down.
Defect Escape Rate: percentage of defects found in production vs. pre-production. The most important single QA metric.
Test Coverage: percentage of requirements/code covered by automated tests.
Mean Time to Resolve (MTTR): average time from defect discovery to resolution.
Defect Density: defects per feature or per 1,000 lines of code — reveals which areas need more testing attention.
Sprint Defect Removal Efficiency: percentage of defects found and resolved within the same sprint they were introduced.
Common mistake: Measuring test execution volume (number of test cases run) as a proxy for quality. More tests executed does not mean better quality, it means the test suite is running. Focus on defect outcomes, not test activity.
Tool tip: Custom dashboards in Jira or Datadog. For dedicated QA analytics, Zephyr Scale and TestRail both offer built-in reporting.
20. Maintain active QA after the release
Category: Process
When: Post-deployment
Go-live is not the end of QA, it is a transition from pre-release defect prevention to post-release quality monitoring. No software ships bug-free. The question is how quickly your team detects, triages, and resolves issues that emerge in production. The teams that do this well have monitoring in place before issues are reported, clear ownership, and a feedback loop back into the test suite.
Set up production monitoring with alerting for error spikes, performance degradation, and failed transactions before launch.
Provide a clear, low-friction bug reporting channel for users. Bugs reported by users represent failures in your pre-release QA, treat them as learning signals.
Triage and prioritise production defects in a regular cadence, not only when they become critical.
Update your regression suite and risk register after every production incident. If a bug escaped to production, your QA process has a gap, find it.
Common mistake: Closing the QA process at go-live and only re-engaging QA when users report major issues. Post-release monitoring is non-negotiable for any software with active users.
Tool tip: Sentry for real-time error tracking. PagerDuty for on-call alerting. Both integrate with Jira for defect lifecycle management.
Priority implementation roadmap
If you are starting from scratch or restructuring an existing QA practice, here is the sequence that delivers the fastest impact:
Apply shift-left testing from requirements phase
Integrate risk-based testing into sprint planning
Add continuous testing to CI/CD pipeline
Start tracking QA KPIs (defect escape rate, test coverage, MTTR)
Build an AI-assisted testing toolchain for regression
Create a centralised test case repository with traceability
Establish a formal performance testing gate before each release
Formalise security testing schedule with OWASP ZAP or Burp Suite
Create a session-based exploratory testing programme
How these practices work in real projects
These are not theoretical ideals, they are the operational baseline we apply on every DeviQA engagement.
Abbott Laboratories (Healthcare): We implemented full-SDLC QA coverage with continuous testing in CI/CD for a global healthcare giant's end-to-end test automation programme. Shift-left testing and structured risk-based prioritisation were central to the engagement. Learn more.
Tipalti (FinTech): A long-term partnership covering accounts payable automation software, where compliance, security testing, and performance testing are not optional. Our QA process covers all 20 practices listed here as part of an ongoing engagement. Learn more.
Xola (Tour & Event Platform): Set up QA from scratch for a growing SaaS platform, starting with a risk register, test case repository, and automation framework, before layering in exploratory testing and post-release monitoring. Learn more.
Next steps
If your team is working through any of these practices and needs experienced QA engineers to accelerate the process, whether that's setting up a test automation framework, building a QA process from scratch, or augmenting an existing team, we should talk.
DeviQA offers a free QA process review: a structured 30-minute session where we assess your current QA maturity and identify the three highest-impact changes you can make in the next 90 days.
Book a strategic QA consultation

About the author
Chief Technology Officer
Dmitry Reznik is the Chief Technology Officer and co-founder at DeviQA, bringing deep technical expertise across software architecture, implementation, and long-term system operation.