API 테스트 체크리스트: 상태 코드부터 AI 자동화까지
API 테스트는 체계적인 접근이 필수입니다. 상태 코드, 응답 구조, 극한 상황, 인증 검증을 포함해야 합니다. Postman은 수동 테스트에 최적화되어 있으며, Jest + axios는 CI/CD 파이프라인과 자연스럽게 통합됩니다. AI 기술은 OpenAPI 사양에서 테스트 케이스를 자동 생성하고 응답을 분석하며, 극단적 데이터 패턴을 탐지하는 데 강력한 도움을 줍니다.
상태 코드
응답 코드가 예상된 시나리오와 일치하는지 확인하세요:
| 시나리오 | 예상 코드 |
|----------|-----------|
| 성공적인 생성 | 201 |
| 리소스 없음 | 404 |
| 권한 부족 | 403 |
| 인증되지 않음 | 401 |
| 유효하지 않은 데이터 | 400/422 |
| 서버 오류 | 500 |
흔한 실수: 본문에 오류 메시지를 담고 있으면서도 200 코드를 반환하는 것—이는 REST 원칙을 위반합니다.
응답 구조
- 필수 필드가 존재해야 합니다.
- 데이터 타입이 예상과 일치해야 합니다 (예: 숫자가 문자열로 전달되는 경우).
- 중첩 객체는 null이 되면 안 됩니다.
- 배열과 객체를 혼동하지 않도록 주의합니다.
극한 상황 테스트
경계 조건을 테스트하세요:
- 비어 있는 요청 본문.
- 필수 필드 누락.
- 필드에 빈 문자열.
- 숫자: 0, 음수값, MAX_INT.
- 문자열: 1자, 최대 길이, 특수문자, SQL/XSS 공격 패킷.
인증 및 헤더
- 토큰 없음 → 401.
- 만료된 토큰 → 401.
- 잘못된 토큰 → 403.
- 쓰기 작업 시 읽기 전용 사용자 → 403.
헤더: Content-Type, CORS, 요청 제한(레이트 리미팅).
Postman으로 테스트하기
응답 후 Tests 탭에서 자바스크립트 스크립트를 사용할 수 있습니다.
기본 검증
// 상태 코드 및 응답 시간
pm.test("Status 200", () => {
pm.response.to.have.status(200);
});
pm.test("Response <500ms", () => {
pm.expect(pm.response.responseTime).to.be.below(500);
});
// Content-Type
pm.test("JSON", () => {
pm.response.to.have.header("Content-Type", "application/json; charset=utf-8");
});
구조 및 타입 검사
const response = pm.response.json();
pm.test("id 존재 여부", () => {
pm.expect(response).to.have.property("id");
});
pm.test("id는 숫자", () => {
pm.expect(response.id).to.be.a("number");
});
pm.test("email 비어 있지 않음", () => {
pm.expect(response.email).to.be.a("string").and.not.empty;
});
음성 테스트: 토큰 없음
pm.test("401 토큰 없음", () => {
pm.response.to.have.status(401);
});
const response = pm.response.json();
pm.expect(response).to.have.property("message");
/login에서 받은 토큰을 환경 변수에 저장하세요: pm.environment.set("auth_token", response.token);. 이후 헤더에서 {{auth_token}}로 참조 가능합니다.
Jest + axios를 활용한 자동화 테스트
CI/CD 파이프라인에서는 코드로 테스트를 작성하세요. /users/:id 엔드포인트 예시:
const axios = require("axios");
const BASE_URL = "https://api.example.com";
const TOKEN = process.env.API_TOKEN;
const client = axios.create({
baseURL: BASE_URL,
headers: { Authorization: `Bearer ${TOKEN}` }
});
describe("GET /users/:id", () => {
test("ID로 사용자 조회", async () => {
const response = await client.get("/users/1");
expect(response.status).toBe(200);
expect(response.data).toMatchObject({
id: expect.any(Number),
email: expect.any(String),
name: expect.any(String),
});
});
test("존재하지 않는 사용자 → 404", async () => {
await expect(client.get("/users/999999"))
.rejects.toMatchObject({
response: { status: 404 }
});
});
test("토큰 없이 접근 → 401", async () => {
await expect(axios.get(`${BASE_URL}/users/1`))
.rejects.toMatchObject({
response: { status: 401 }
});
});
});
실행 명령어: npx jest user.test.js.
포괄적 체크리스트
긍정 시나리오:
- 유효한 데이터 → 올바른 상태 코드.
- 응답 구조가 문서와 일치.
- 필수 필드 존재.
- 정확한 데이터 타입.
- 응답 시간 제한 내.
부정 시나리오:
- 인증 없음 → 401.
- 잘못된 토큰 → 403.
- 필드 누락 → 400/422.
- 타입 오류 → 400/422.
- 존재하지 않는 리소스 → 404.
- 비어 있는 본문 → 검증 오류.
극한 상황:
- 최소/최대 값.
- 0 또는 음수 숫자.
- 빈 문자열.
- 특수문자/유니코드.
- 긴 문자열.
보안:
- SQL 인젝션.
- XSS.
- IDOR (ID 추측 공격).
AI 기반 자동화
AI는 OpenAPI 사양에서 긍정, 부정, 극한 상황 테스트 케이스를 자동 생성하고, Jest 형식으로 제공합니다.
프롬프트 예시: "[schema] 기반으로 POST /users에 대한 테스트를 생성해 주세요. 현실적인 데이터를 사용하세요."
LLM을 활용한 응답 자동 분석:
async function validateWithAI(prompt, response) {
// Claude/GPT 호출하여 관련성 평가
// ...
return data.content[0].text.trim() === "YES";
}
극한 데이터 생성: AI는 RTL 텍스트, 이모티콘, 보이지 않는 유니코드 문자를 제안합니다.
AI는 비즈니스 로직 이해를 대체하지 않습니다 (예: 비프리미엄 사용자에게 할인율 ≤ 100).
가장 중요한 점
- 각 시나리오에 맞춰 상태 코드를 엄격히 검증하세요. 오류 시 200 코드를 사용하지 마세요.
- JSONPath 유사 문법을 활용해 응답 구조와 타입을 검증하세요.
- CI/CD에서 Jest/axios로 부정 및 극한 상황 테스트를 자동화하세요.
- AI를 반복 작업(테스트 생성, 분석, 극한 데이터)에 활용하세요.
- 모든 엔드포인트에 이 체크리스트를 의무적으로 적용하세요.
— Editorial Team
아직 댓글이 없습니다.