Python으로 API 테스트를 시작하고 싶은 엔지니어를 위해. pytest・requests를 사용한 CRUD 조작의 API 테스트부터 HTML 리포트・CSV 출력까지, 이 시리즈 하나로 전부 배울 수 있습니다.
이 글에서는 API 테스트 완전 시리즈의 전체 기사를 정리해서 소개합니다. 초보자부터 실무 엔지니어까지 스텝 바이 스텝으로 배울 수 있는 구성입니다.
✅ 결론
Python으로 API 테스트를 자동화한다면 pytest + requests 조합이 가장 심플하고 실무에서도 사용됩니다.
이 시리즈에서는 다음 내용을 전 7기사로 체계적으로 배울 수 있는 구성으로 되어 있습니다.
- API 테스트의 기초 지식
- CRUD 조작(GET・POST・PUT/PATCH・DELETE)의 구현
- 헤더・스키마 검증 등 실무 패턴
- HTML 리포트(pytest-html)에 의한 결과 시각화
- CSV 에비던스에 의한 테스트 결과 기록과 공유
📌 이 글은 이런 분께 추천합니다
- Python으로 API 테스트를 처음부터 배우고 싶은 분
- pytest・requests의 사용법을 정리해서 확인하고 싶은 분
- CRUD 전 조작의 API 테스트를 포트폴리오에 추가하고 싶은 분
- UI 테스트뿐만 아니라 API 테스트도 할 수 있는 엔지니어가 되고 싶은 분
✅ 이 시리즈에서 배울 수 있는 것
- API 테스트란 무엇인가・왜 중요한가의 기초 지식
- pytest・requests에 의한 GET・POST・PUT/PATCH・DELETE 전체 테스트 구현
- raise_for_status()・헤더 검증・스키마 검증 등 실무 패턴
- HTML 리포트・CSV 출력에 의한 테스트 결과 시각화와 공유
00. 이 API 테스트 시리즈에 대해
이 시리즈는 Python으로 API 테스트를 제로부터 배우는 전 7회의 기사입니다. 환경 구축부터 시작해서 GET 테스트부터 순서대로 CRUD 전 조작을 구현하고, 최종적으로 HTML 리포트와 CSV로 테스트 결과를 관리하는 방법까지 배울 수 있습니다.
| 기사 | 타이틀 | 내용 |
|---|---|---|
| ① | API 테스트란? | 개념・UI 테스트와의 차이・기본 패턴 |
| ② | 환경 구축 | pip install・venv・pytest.ini 설정 |
| ③ | GET 테스트 | 상태・응답・스키마 검증 |
| ④ | POST 테스트 | 데이터 생성・ID 부여・유효성 검사 검증 |
| ⑤ | PUT/PATCH 테스트 | 전체 업데이트・부분 업데이트의 차이와 구현 |
| ⑥ | DELETE 테스트 | 삭제・삭제 후 404 확인 |
| ⑦ | CSV・리포트화 | pytest-html・CSV 출력・에비던스 관리 |
💡 포인트:각 기사는 독립해서 읽을 수 있지만 ①→②→③의 순서로 읽으면 체계적으로 배울 수 있습니다. 특정 HTTP 메서드만 알고 싶은 경우는 그 기사로 바로 이동하세요.
01. API 테스트 시리즈 기사 목록
각 기사는 독립해서 읽을 수 있지만, ①→②→③의 순서로 읽으면 체계적으로 배울 수 있습니다.
02. 시리즈에서 배운 실무 코드 패턴
이 시리즈를 통해 등장한 실무에서 반드시 사용하는 코드 패턴을 정리합니다.
① 실무의 기본 패턴(매번 사용하는 3행)
response = requests.get(url, timeout=5)
response.raise_for_status() # 4xx/5xx로 자동 예외
elapsed_ms = response.elapsed.total_seconds() * 1000② 헤더 체크(부분 일치가 정답)
# ✅ in 으로 부분 일치(charset 포함이어도 실패하지 않음)
content_type = response.headers.get("Content-Type", "")
assert "application/json" in content_type③ 필수 필드 일괄 검증
required_fields = ["id", "name", "email"]
for field in required_fields:
assert field in body, f"'{field}' 가 존재하지 않습니다"④ 스키마(타입)검증
assert isinstance(body["id"], int)
assert isinstance(body["name"], str)
assert isinstance(body["email"], str)⑤ FAIL 시에도 CSV에 기록하는 패턴
try:
assert response.status_code == 200
write_result("TC01", "GET /users/1", "PASS", ...)
except AssertionError as e:
write_result("TC01", "GET /users/1", "FAIL", ..., str(e))
raise # pytest에 실패를 전달💡 포인트:이 5가지 패턴을 조합하는 것만으로 실무 수준의 API 테스트 코드를 작성할 수 있습니다.
03. 이 시리즈에서 구현한 테스트 케이스 목록
시리즈 전체로 합계 34건의 테스트 케이스를 구현했습니다.
| 카테고리 | 건수 | 주요 검증 내용 |
|---|---|---|
| GET 테스트 | 9건 | 상태・raise_for_status・헤더・바디・필드・스키마・404・목록・응답 시간 |
| POST 테스트 | 9건 | 201 확인・raise_for_status・헤더・바디・ID 부여・필수 필드 없음・빈 문자열・잘못된 이메일・스키마 |
| PUT/PATCH 테스트 | 9건 | PUT200・raise_for_status・PUT 바디・헤더・PATCH200・PATCH 바디・PATCH 복수・스키마・404 |
| DELETE 테스트 | 7건 | 200 확인・raise_for_status・응답 바디・삭제 후 404・존재하지 않는 리소스・200/204・헤더 |
💡 포인트:34건의 테스트 케이스로 CRUD 전 조작을 커버할 수 있습니다. 「API 테스트가 가능하다」는 포트폴리오 어필로서 충분한 내용입니다.
04. API 테스트의 포트폴리오 활용법
이 시리즈에서 구현한 코드를 포트폴리오로 공개할 때의 포인트를 소개합니다.
GitHub에 공개하는 구성(추천)
automated-testing-portfolio/
├── README.md ← 테스트 케이스 목록・실행 방법 기재
├── pytest.ini ← HTML 리포트 자동 생성 설정
├── requirements.txt ← 의존 라이브러리 목록
├── tests/
│ ├── test_get_api.py ← GET 테스트(9건)
│ ├── test_post_api.py ← POST 테스트(9건)
│ ├── test_put_patch_api.py ← PUT/PATCH 테스트(9건)
│ └── test_delete_api.py ← DELETE 테스트(7건)
├── report.html ← 테스트 실행 결과(HTML 리포트)
└── test_results.csv ← 테스트 실행 결과(CSV)💡 포인트:report.html 과 test_results.csv 를 GitHub에 포함하면 「실제로 동작시킨 증거」가 그대로 보입니다. 클라이언트나 채용 담당자에 대한 어필이 됩니다.
05. API 테스트 시리즈 자주 겪는 문제 총정리
시리즈 전체를 통해 특히 자주 나오는 문제들을 정리합니다.
① Content-Type은 == 가 아닌 in 으로 비교한다
# ❌ charset 포함으로 실패한다
assert response.headers["Content-Type"] == "application/json"
# ✅ 부분 일치로 안전
assert "application/json" in response.headers.get("Content-Type", "")② 204 No Content에서 json()을 호출하면 오류가 발생한다
# ✅ 상태 코드로 분기한다
if response.status_code == 204:
body = None
else:
body = response.json()③ raise_for_status와 assert의 사용 구분
# 정상계: raise_for_status()로 4xx/5xx를 일괄 검지
response.raise_for_status()
# 이상계: 의도적으로 4xx/5xx를 확인할 때는 assert를 사용
response = requests.delete(url, timeout=5)
assert response.status_code == 404④ CSV 출력은 utf-8-sig로 Excel 대응
# ✅ Excel에서 CSV를 열어도 깨지지 않음
with open(CSV_FILE, mode="w", encoding="utf-8-sig") as f:
...⑤ timeout과 response.elapsed로 실무 품질로
# ✅ 실무의 기본 패턴
response = requests.get(url, timeout=5)
elapsed_ms = response.elapsed.total_seconds() * 100006. 자주 묻는 질문(FAQ)
Q. pytest와 Postman 어느 것으로 API 테스트를 작성해야 하나요?
A. 수동 테스트나 동작 확인이라면 Postman이 편리하지만, 자동 테스트나 CI/CD에 조합하는 경우는 pytest + requests가 더 적합합니다. 코드로서 관리할 수 있기 때문에 테스트 재사용・자동 실행・GitHub에서의 공유가 가능해집니다. 포트폴리오로 공개하려면 pytest + requests를 추천합니다.
Q. 이 시리즈는 어느 순서로 읽으면 좋나요?
A. API 테스트가 처음인 분은 ①→②→③의 순서로 읽는 것을 권장합니다. 특정 HTTP 메서드만 배우고 싶은 분은 그 기사로 바로 이동하세요. 각 기사는 독립해서 읽을 수 있도록 구성되어 있습니다.
Q. JSONPlaceholder 외의 API로 시험해볼 수 있나요?
A. 예. 인증 플로우 테스트에는 Restful Booker、더 본격적인 테스트에는 reqres.in 이나 직접 만든 API를 사용할 수 있습니다. 이 시리즈의 코드는 API의 URL을 바꾸기만 하면 다른 API에도 응용할 수 있습니다.
Q. 이 시리즈의 코드를 포트폴리오에 사용해도 되나요?
A. 물론입니다. GitHub에 공개하여 포트폴리오로 활용해주세요. README에 테스트 케이스 목록과 실행 방법을 기재하고 HTML 리포트도 포함하면 완성도가 올라갑니다.
Q. Playwright의 코드도 함께 넣는 편이 좋나요?
A. 예. UI 테스트(Playwright)와 API 테스트(requests)를 1개의 리포지토리로 공개하면 「UI도 API도 둘 다 가능합니다」라는 어필이 됩니다. 실제로 GitHub에서 공개하고 있는 포트폴리오 구성으로 추천합니다.
Q. CI/CD에 조합하는 방법이 있나요?
A. GitHub Actions를 사용하면 push할 때마다 API 테스트를 자동 실행할 수 있습니다. .github/workflows/test.yml 을 작성하여 pytest 커맨드를 실행하는 설정을 추가하기만 하면 됩니다. 시리즈의 다음 단계로 검토해보세요.
07. 정리
Python에 의한 API 테스트 자동화는 pytest와 requests 2가지를 조합하는 것만으로 실무 수준의 품질이 실현됩니다. 이 시리즈에서 배운 스킬은 포트폴리오로서도 Upwork나 LinkedIn에 대한 어필로서도 충분한 내용입니다.
이 시리즈에서는 API 테스트의 기초부터 실무 패턴・리포트화까지 전 7회로 해설했습니다.
| 스킬 | 내용 |
|---|---|
| API 테스트의 기초 | 개념・환경 구축・기본 패턴 이해 |
| CRUD 전 조작 테스트 | GET・POST・PUT/PATCH・DELETE 구현(34건) |
| 실무 패턴 습득 | raise_for_status・헤더 검증・스키마 검증 |
| 리포트・CSV 출력 | pytest-html・csv 모듈・에비던스 관리 |
| 포트폴리오 활용 | GitHub 공개・HTML 리포트・requirements.txt |
이 시리즈를 끝까지 읽어주셔서 감사합니다. 「UI 테스트도 API 테스트도 가능한 QA 엔지니어」로서 꼭 포트폴리오에 활용해주세요💪

