# Load Testing Execution Guide ## Test Execution Checklist ### Pre-Test Requirements - [ ] Backend server is running (`pnpm dev`) - [ ] Database is accessible - [ ] k6 is installed (`k6 version`) - [ ] Environment variables are configured ### Verification Test Run the verification script first to ensure everything is set up correctly: ```bash k6 run tests/k6/verify-setup.js ``` **Expected Output:** ``` === K6 Setup Verification === Target: http://localhost:3000 Home page status: 200 API status: 200 Pages API response time: 123ms ✓ Server is reachable ✓ Home page responds ✓ API endpoint responds ``` ## Test Scenarios ### 1. Public Browsing Test **Purpose:** Verify public pages can handle 100 concurrent users **Prerequisites:** - Backend running - Public pages accessible **Execution:** ```bash # Local testing pnpm test:load # With custom URL k6 run --env BASE_URL=http://localhost:3000 tests/k6/public-browsing.js # Staging k6 run --env BASE_URL=https://staging.enchun.tw tests/k6/public-browsing.js ``` **Success Criteria:** - p95 response time < 500ms - Error rate < 1% - 100 concurrent users sustained for 2 minutes **What It Tests:** - Homepage rendering - Page navigation - Static content delivery - Database read operations --- ### 2. API Performance Test **Purpose:** Verify API endpoints meet performance targets **Prerequisites:** - Backend running - API endpoints accessible **Execution:** ```bash # Local testing pnpm test:load:api # With custom URL k6 run --env BASE_URL=http://localhost:3000 tests/k6/api-performance.js # Staging k6 run --env BASE_URL=https://staging.enchun.tw tests/k6/api-performance.js ``` **Success Criteria:** - p95 response time < 300ms - Error rate < 0.5% - Throughput > 100 req/s **What It Tests:** - REST API endpoints - GraphQL queries - Authentication endpoints - Concurrent API requests --- ### 3. Admin Operations Test **Purpose:** Verify admin panel can handle 20 concurrent users **Prerequisites:** - Backend running - Valid admin credentials **Execution:** ```bash # Local testing k6 run \ --env ADMIN_EMAIL=admin@enchun.tw \ --env ADMIN_PASSWORD=yourpassword \ tests/k6/admin-operations.js # Or use npm script ADMIN_EMAIL=admin@enchun.tw ADMIN_PASSWORD=yourpassword \ pnpm test:load:admin ``` **Success Criteria:** - p95 response time < 700ms - Error rate < 1% - 20 concurrent users sustained for 3 minutes **What It Tests:** - Login/authentication - CRUD operations - Admin panel performance - Database write operations **Warning:** This test creates draft posts in the database. Clean up manually after testing. --- ## Test Execution Strategy ### Phase 1: Development Testing Run tests locally during development with low load: ```bash # Quick smoke test (10 users) k6 run --env STAGED_USERS=10 tests/k6/public-browsing.js # API smoke test (5 users) k6 run --env STAGED_USERS=5 tests/k6/api-performance.js ``` ### Phase 2: Pre-Deployment Testing Run full test suite against staging: ```bash # Run all tests pnpm test:load:all # Or individual tests with full load k6 run --env BASE_URL=https://staging.enchun.tw tests/k6/public-browsing.js k6 run --env BASE_URL=https://staging.enchun.tw tests/k6/api-performance.js k6 run --env BASE_URL=https://staging.enchun.tw \ --env ADMIN_EMAIL=$STAGING_ADMIN_EMAIL \ --env ADMIN_PASSWORD=$STAGING_ADMIN_PASSWORD \ tests/k6/admin-operations.js ``` ### Phase 3: Production Monitoring Schedule automated tests (via GitHub Actions or cron): - Daily: Public browsing and API tests - Weekly: Full test suite including admin operations - On-demand: Before major releases --- ## Result Analysis ### Key Metrics to Check 1. **p95 Response Time** - Public pages: < 500ms ✅ - API endpoints: < 300ms ✅ - Admin operations: < 700ms ✅ 2. **Error Rate** - Public: < 1% ✅ - API: < 0.5% ✅ - Admin: < 1% ✅ 3. **Throughput** - API: > 100 req/s ✅ - Pages: > 50 req/s ✅ 4. **Virtual Users (VUs)** - Should sustain target VUs for full duration - No drops or connection errors ### Sample Output Analysis ``` ✓ http_req_duration..............: avg=185ms p(95)=420ms ✓ http_req_failed................: 0.00% ✓ 0 ✗ 12000 ✓ checks.........................: 100.0% ✓ 12000 ✗ 0 iterations.....................: 2400 20 /s vus............................: 100 min=100 max=100 ``` **This result shows:** - ✅ p95 = 420ms (< 500ms threshold) - ✅ Error rate = 0% (< 1% threshold) - ✅ All checks passed - ✅ Sustained 100 VUs --- ## Troubleshooting Guide ### Issue: Connection Refused **Symptoms:** ``` ERRO[0000] GoError: dial tcp 127.0.0.1:3000: connect: connection refused ``` **Solutions:** 1. Ensure backend is running: `pnpm dev` 2. Check port is correct: `--env BASE_URL=http://localhost:3000` 3. Verify firewall isn't blocking connections --- ### Issue: High Error Rate (> 1%) **Symptoms:** ``` ✗ http_req_failed................: 2.50% ✓ 11700 ✗ 300 ``` **Common Causes:** 1. Server overloaded → Reduce VUs 2. Database connection issues → Check DB logs 3. Missing authentication → Check credentials 4. Invalid URLs → Verify BASE_URL **Solutions:** ```bash # Reduce load to diagnose k6 run --env STAGED_USERS=10 tests/k6/public-browsing.js # Check server logs in parallel tail -f logs/backend.log ``` --- ### Issue: Slow Response Times (p95 >= 500ms) **Symptoms:** ``` http_req_duration..............: avg=450ms p(95)=850ms ``` **Common Causes:** 1. Unoptimized database queries 2. Missing database indexes 3. Large payload sizes 4. Server resource constraints **Solutions:** 1. Check database query performance 2. Review database indexes 3. Optimize images/assets 4. Scale server resources 5. Enable caching --- ### Issue: Login Failed (Admin Test) **Symptoms:** ``` ✗ login successful status: 401 ``` **Solutions:** 1. Verify admin credentials are correct 2. Check admin user exists in database 3. Ensure admin user has correct role 4. Try logging in via admin panel first --- ## Performance Optimization Tips Based on test results, you may need to: 1. **Add Database Indexes** ```javascript // Example: Index on frequently queried fields Posts.createIndex({ title: 1 }); Posts.createIndex({ status: 1, createdAt: -1 }); ``` 2. **Enable Caching** - Cache global API responses - Cache public pages - Use CDN for static assets 3. **Optimize Images** - Use WebP format - Implement lazy loading - Serve responsive images 4. **Database Optimization** - Limit query depth where possible - Use projection to reduce payload size - Implement pagination 5. **Scale Resources** - Increase server memory/CPU - Use database connection pooling - Implement load balancing --- ## Reporting ### Generate Reports ```bash # JSON report k6 run --out json=results.json tests/k6/public-browsing.js # HTML report npm install -g k6-reporter k6-reporter results.json --output results.html open results.html ``` ### Share Results Include in your PR/daily standup: - p95 response time - Error rate - Throughput - Any issues found --- ## Best Practices 1. **Run tests regularly** - Catch regressions early 2. **Test on staging first** - Avoid breaking production 3. **Monitor trends** - Track performance over time 4. **Share results** - Keep team informed 5. **Update baselines** - Adjust as system evolves 6. **Don't ignore failures** - Investigate all issues --- **Last Updated:** 2025-01-31 **Owner:** QA Team