문제 상황 및 배경

테스트 코드

collector.py

import asyncio
import aiohttp
import random
import time
import json

API_URL = "<http://localhost:8080/mock/member>"
AUTH_TOKEN = "Bearer {본인 로그인 token 넣기}"
TOTAL_RUNS = 10  # 총 테스트 횟수 (변경 가능)

HEADERS = {
    "Authorization": AUTH_TOKEN,
    "Content-Type": "application/json"
}

# 테스트용 문제 텍스트 샘플
PLAIN_TEXTS = [
    "개발 방법론에는 Agile이 있으며, 대표적인 프로세스로는 XP와 Scrum이 있다.\\n\\nXP는 계획 절차, 소규모 릴리즈, 상징(Metaphor), 공동 소유, 지속적인 통합(CI)을 기본 원리로 한다.\\n\\n럼바우 방법론은 객체 모델링, 동적 모델링, 기능 모델링으로 구성되며 각각 객체 다이어그램, 상태 다이어그램, 자료 흐름도로 표현된다."
]

# 가능한 유형 조합들 (변경 가능)
MOCK_EXAM_TYPE_COMBOS = [
    ["FIND_CORRECT"],
    ["FIND_INCORRECT"],
    ["FIND_MATCH"],
    ["FIND_CORRECT", "FIND_INCORRECT"],  
    ["FIND_MATCH", "FIND_CORRECT"]
]

async def send_request(session, idx):
    payload = {
        "plainText": random.choice(PLAIN_TEXTS),
        "mockExamTypeList": random.choice(MOCK_EXAM_TYPE_COMBOS)
    }

    print(f"[요청 전송 #{idx}] {API_URL} -> {payload}")
    start_time = time.time()
    try:
        async with session.post(API_URL, headers=HEADERS, json=payload) as resp:
            elapsed = time.time() - start_time
            text = await resp.text()
            print(f"[응답 #{idx}] status={resp.status}, elapsed={elapsed:.2f}s")
            return {"status": resp.status, "elapsed": elapsed, "body": text}
    except Exception as e:
        print(f"[에러 #{idx}] {e}")
        return {"status": "error", "error": str(e)}

async def main():
    async with aiohttp.ClientSession() as session:
        results = []
        for i in range(1, TOTAL_RUNS + 1):
            result = await send_request(session, i)
            results.append(result)

            # 5~10초 랜덤 딜레이(요청 건수 제한 방지)
            delay = random.uniform(5, 10)
            print(f"[딜레이] 다음 요청까지 {delay:.1f}초 대기...")
            await asyncio.sleep(delay)

        # 결과 저장
        with open("raw_results.json", "w", encoding="utf-8") as f:
            json.dump(results, f, ensure_ascii=False, indent=2)
        print("✅ 테스트 완료! raw_results.json 파일 저장됨.")

if __name__ == "__main__":
    asyncio.run(main())

<aside> 💡

$ python collector.py

</aside>

analyzer.py

🔎 현재 품질 검증 (이상 현상 reason 목록)

: detect_abnormalities 함수에서 다음 5가지 주요 품질 이상 현상을 검출합니다.