skipLink.label

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 tests

Dependency Map

// Code changes
const changes = [
{ file: 'src/auth/login.js', type: 'modified' },
{ file: 'src/utils/helpers.js', type: 'modified' }
];
// Dependency map
const 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

  1. Download ไฟล์เริ่มต้นของ quest:

    Terminal window
    npx bluebeltdojo download quest-42-regression-test-predictor
    cd quest-42-regression-test-predictor
  2. เปิด problem.js ใน editor ของคุณพร้อมความช่วยเหลือของ AI

  3. Implement solve() ที่ predict regression tests จาก code changes

  4. ตรวจสอบ solution ของคุณ:

    Terminal window
    node test.js
  5. เมื่อ tests ผ่านทั้งหมด ส่งคำตอบ:

    Terminal window
    npx bluebeltdojo submit

💡 Tip: ลองนึกถึง project ที่คุณ refactor บ่อย — predict tests จะช่วยประหยัดเวลาได้มาก


คำใบ้

  • ดู dependency map ใน problem.js สำหรับ file relationships
  • คิดถึง transitive dependencies — ไม่ใช่แค่ direct imports
  • ทดสอบกับ code changes หลายแบบ