현재 퀴즐리(Quizly)는 AI 기반 모의고사 제작 API를 통해 다양한 문제 유형(TRUE_FALSE, FIND_MATCH, FIND_CORRECT, FIND_INCORRECT 등)을 자동 생성합니다.
그러나 실제 운영 환경에서는
등의 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해, **자동화된 품질 검증 시스템(collector → analyzer → dashboard)**을 구성하였습니다.
Python 기반으로 설계되어, 단일 명령어 실행만으로 API 응답 품질을 통계적으로 수집·분석·시각화할 수 있습니다.
코드를 조금만 수정하면 같은 Flow를 활용하여 다른 API 요청 테스트도 시도해볼 수 있습니다.
TOTAL_RUNS만큼 보낼 수 있습니다.
MOCK_EXAM_TYPE_COMBOS로 설정한 후 random함수를 이용해 랜덤 요청을 보내게 됩니다.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>
raw_result.json 파일이 생성되며 동시에 저장됩니다.raw_result.json 파일을 기반으로 품질 검증을 위한 분석을 진행하는 코드입니다.🔎 현재 품질 검증 (이상 현상 reason 목록)
: detect_abnormalities 함수에서 다음 5가지 주요 품질 이상 현상을 검출합니다.