test: E2E 5차 전체 테스트 결과 및 개발팀 수정 요청서 (177 PASS / 7 FAIL)
- run-all.js에 --skip-passed 옵션 추가 (이미 성공한 시나리오 건너뛰기) - 5차 E2E 전체 테스트 결과 리포트 추가 (184개 시나리오, 96.2% 성공률) - 개발팀 버그 수정 요청서 작성 (미수정 3건: 정렬/필터/리다이렉트) - 4차 대비 4건 해소, 신규 리그레션 0건 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
* node e2e/runner/run-all.js --headed # headed (기본값)
|
||||
* node e2e/runner/run-all.js --headless # headless
|
||||
* node e2e/runner/run-all.js --exclude sales # 파일명에 "sales" 포함된 것 제외
|
||||
* node e2e/runner/run-all.js --skip-passed # 이미 성공한 시나리오 건너뛰기
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
@@ -44,6 +45,7 @@ const EXCLUDE = (() => {
|
||||
const idx = args.indexOf('--exclude');
|
||||
return idx >= 0 && args[idx + 1] ? args[idx + 1] : null;
|
||||
})();
|
||||
const SKIP_PASSED = args.includes('--skip-passed');
|
||||
|
||||
// ─── Helpers ────────────────────────────────────────────────
|
||||
|
||||
@@ -61,6 +63,26 @@ function sleep(ms) {
|
||||
return new Promise((r) => setTimeout(r, ms));
|
||||
}
|
||||
|
||||
/**
|
||||
* success/ 폴더의 OK- 리포트에서 이미 성공한 시나리오 ID 집합을 반환.
|
||||
* 파일명 형식: OK-{scenario-id}_{timestamp}.md
|
||||
*/
|
||||
function getPassedScenarioIds() {
|
||||
const passed = new Set();
|
||||
if (!fs.existsSync(SUCCESS_DIR)) return passed;
|
||||
const files = fs.readdirSync(SUCCESS_DIR).filter(f => f.startsWith('OK-') && f.endsWith('.md'));
|
||||
for (const f of files) {
|
||||
// OK-accounting-deposit_2026-02-23_20-22-27.md → accounting-deposit
|
||||
const withoutPrefix = f.substring(3); // remove "OK-"
|
||||
const tsMatch = withoutPrefix.match(/_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}\.md$/);
|
||||
if (tsMatch) {
|
||||
const id = withoutPrefix.substring(0, tsMatch.index);
|
||||
passed.add(id);
|
||||
}
|
||||
}
|
||||
return passed;
|
||||
}
|
||||
|
||||
/** Color console helpers */
|
||||
const C = {
|
||||
green: (s) => `\x1b[32m${s}\x1b[0m`,
|
||||
@@ -1247,6 +1269,7 @@ async function main() {
|
||||
if (WORKFLOW_ONLY) console.log(`카테고리: workflow only`);
|
||||
if (FILTER) console.log(`필터: ${FILTER}`);
|
||||
if (EXCLUDE) console.log(`제외: ${EXCLUDE}`);
|
||||
if (SKIP_PASSED) console.log(`스킵: 이미 성공한 시나리오 건너뛰기 (--skip-passed)`);
|
||||
console.log('');
|
||||
|
||||
// Ensure directories
|
||||
@@ -1277,6 +1300,21 @@ async function main() {
|
||||
scenarioFiles = scenarioFiles.filter((f) => !f.includes(EXCLUDE));
|
||||
}
|
||||
|
||||
// --skip-passed: 이미 성공한 시나리오 건너뛰기
|
||||
let skippedCount = 0;
|
||||
if (SKIP_PASSED) {
|
||||
const passedIds = getPassedScenarioIds();
|
||||
const before = scenarioFiles.length;
|
||||
scenarioFiles = scenarioFiles.filter((f) => {
|
||||
const id = f.replace('.json', '');
|
||||
return !passedIds.has(id);
|
||||
});
|
||||
skippedCount = before - scenarioFiles.length;
|
||||
if (skippedCount > 0) {
|
||||
console.log(C.cyan(`이미 성공한 시나리오 ${skippedCount}개 건너뜀 (--skip-passed)\n`));
|
||||
}
|
||||
}
|
||||
|
||||
const totalScenarios = scenarioFiles.length;
|
||||
console.log(`시나리오: ${totalScenarios}개 발견\n`);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user