Quest 42 - Regression Test Predictor
Quest 42: Regression Test Predictor
hard 25 minutes🎯 Learning Objectives
- เข้าใจว่า code changes ส่งผลต่อ tests ยังไง
- ใช้ AI ช่วย predict ว่า tests ไหนต้อง run หลัง code change
- ลด test execution time โดยเลือก test ที่จำเป็นเท่านั้น
- เรียนรู้ impact analysis สำหรับ regression testing
📖 Concept: Regression Test Prediction
Regression testing คือการรัน tests ทั้งหมดหลัง code change เพื่อ ensure ว่าไม่มีอะไร break — แต่ใน codebase ใหญ่ๆ การรัน tests ทั้งหมดใช้เวลานานมาก
Regression test prediction คือการใช้ AI predict ว่า code change จะส่งผลต่อ tests ไหนบ้าง — แล้วรันแค่ tests ที่จำเป็น
เหมือน Ninjutsu master ที่มองเห็นว่าการเปลี่ยนแปลงเล็กๆ จะส่งผลต่อ technique ไหนบ้าง — ไม่ต้องฝึกทุก technique ใหม่
⚙️ How It Works
กระบวนการ Predict Regression Tests
1. DETECT — ตรวจจับ code changes ↓2. ANALYZE — วิเคราะห์ dependencies ↓3. MAP — map ว่า changes ส่งผลต่อ modules ไหน ↓4. PREDICT — predict ว่า tests ไหนต้อง run ↓5. EXECUTE — รันแค่ predicted testsDependency Map
// Code changesconst changes = [ { file: 'src/auth/login.js', type: 'modified' }, { file: 'src/utils/helpers.js', type: 'modified' }];
// Dependency mapconst dependencies = { 'src/auth/login.js': [ 'tests/auth/login.test.js', 'tests/auth/integration.test.js', 'tests/e2e/login-flow.test.js' ], 'src/utils/helpers.js': [ 'tests/utils/helpers.test.js', 'tests/auth/login.test.js', // login ใช้ helpers 'tests/api/users.test.js' // users ใช้ helpers ]};💡 Example: Predict Affected Tests
function predictAffectedTests(changes, dependencies) { const affectedTests = new Set();
for (const change of changes) { // หา tests ที่ dependency กับ file ที่เปลี่ยน const directTests = dependencies[change.file] || []; directTests.forEach(test => affectedTests.add(test));
// หา transitive dependencies for (const test of directTests) { const moreDeps = dependencies[test] || []; moreDeps.forEach(dep => affectedTests.add(dep)); } }
return { changedFiles: changes.map(c => c.file), affectedTests: [...affectedTests], totalTests: affectedTests.size, estimatedTime: `${affectedTests.size * 2} seconds` };}
// ใช้งานconst prediction = predictAffectedTests( [{ file: 'src/auth/login.js', type: 'modified' }], { 'src/auth/login.js': [ 'tests/auth/login.test.js', 'tests/auth/integration.test.js' ] });
console.log(prediction);// {// changedFiles: ['src/auth/login.js'],// affectedTests: ['tests/auth/login.test.js', 'tests/auth/integration.test.js'],// totalTests: 2,// estimatedTime: '4 seconds'// }⚠️ Common Mistakes
Mistake 1: รัน tests ทั้งหมดทุกครั้ง
“ปลอดภัยไว้ก่อน รันทุก test เลย” → ใน codebase ใหญ่จะช้ามาก — predict แล้วรันแค่ที่จำเป็น
Mistake 2: มองข้าม transitive dependencies
“file A ไม่ได้ import file B ตรงๆ” → File A อาจ import file C ที่ import file B — ต้องดู transitive
Mistake 3: ไม่ update dependencies เมื่อ refactor
” refactor แล้ว dependencies เดิมก็ได้” → Dependencies เปลี่ยนเมื่อ refactor — ต้อง update map เสมอ
Mistake 4: ไม่ verify prediction accuracy
“AI predict แล้วก็ run ตามนั้น” → บางครั้ง prediction miss — ควรมี fallback รัน full test suite บ้าง
📝 Knowledge Check
📝 Knowledge Check
Q1:Regression test prediction ช่วยประหยัดเวลาได้ยังไง?
Q2:Transitive dependencies สำคัญในการ predict regression tests อย่างไร?
Q3:เพราะเหตุใดจึงไม่ควร rely แค่ AI prediction โดยไม่มี fallback?
🏋️ Quest: Regression Test Predictor
พร้อมแล้ว predict tests! ใช้ AI ช่วยเลือก tests ที่ต้อง run
-
Download ไฟล์เริ่มต้นของ quest:
Terminal window npx bluebeltdojo download quest-42-regression-test-predictorcd quest-42-regression-test-predictor -
เปิด
problem.jsใน editor ของคุณพร้อมความช่วยเหลือของ AI -
Implement
solve()ที่ predict regression tests จาก code changes -
ตรวจสอบ solution ของคุณ:
Terminal window node test.js -
เมื่อ tests ผ่านทั้งหมด ส่งคำตอบ:
Terminal window npx bluebeltdojo submit
💡 Tip: ลองนึกถึง project ที่คุณ refactor บ่อย — predict tests จะช่วยประหยัดเวลาได้มาก
คำใบ้
- ดู dependency map ใน problem.js สำหรับ file relationships
- คิดถึง transitive dependencies — ไม่ใช่แค่ direct imports
- ทดสอบกับ code changes หลายแบบ