k6 load test scripts for API endpoints and critical user journeys: ramping virtual user (VU) tests that confirm the system holds under the projected concurrent user count before launch rather than after. Test scenarios are matched to actual usage patterns. A flash sale API needs a spike test: ramp from 0 to 10x normal VU count in 30 seconds, hold for 5 minutes, ramp down. A reporting endpoint needs a soak test: consistent 2x normal concurrency for 60 minutes to catch memory leaks and connection pool exhaustion that only appear over time. A checkout flow needs a stress test: incremental VU increase until the first error threshold is breached, identifying the ceiling. Performance thresholds defined in the k6 test script (thresholds configuration) -- p95 response time under 500ms, p99 under 1000ms, HTTP error rate under 0.5% -- so the test passes or fails objectively against agreed criteria rather than requiring manual judgement. Artillery as an alternative for event-driven and WebSocket load testing when k6's VU model is less representative. Lighthouse CI integrated into the PR pipeline for frontend performance: LCP, CLS, and INP regressions fail the build when they cross configured thresholds, catching the slow-loading image or unoptimised bundle on the PR that introduced it. Core Web Vitals baseline established at project start and tracked per release in a performance budget spreadsheet so trend changes are visible against a 12-week history rather than only compared to the previous release.
Security testing integrated into the QA scope: OWASP ZAP (Zed Attack Proxy) in baseline scan mode run against the staging environment before each major release, producing a report of common vulnerabilities (SQL injection surface, reflected XSS, missing CSRF tokens, insecure headers) without requiring a full penetration test. Dependency vulnerability scanning with Snyk or OWASP Dependency-Check on every PR -- flagging packages with known CVEs in the dependency tree before they reach production. These are not a replacement for a formal security audit but they catch the common vulnerabilities that should never reach production in a mature engineering team's release process.
Test environment management: test data seeding scripts that create deterministic, predictable test fixtures from a single command so any QA engineer can reproduce any test scenario on any branch without knowing which database records existed at the time a bug was filed. Environment-specific configuration managed via .env.test files with no production credentials. Database snapshot automation for restoring test environments to a known state after a test run modifies data, eliminating test order dependencies (a test that passes when run in isolation but fails when run after another test that left the database in an unexpected state is a hidden reliability problem).