Playwright 는 주로 Browser UI 검증에 활용되는 도구지만, API Test 에도 활용할 수 있다
정글 입학시험 준비자료에서 다뤘던 서울시 실시간 대기정보 Open API 를 예시로
Playwright Python 을 이용한 API Test 를 간단하게 만져봤다
🔗 API URL
http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99
✅ To Do
1. 요청이 성공적으로 되는지
2. 응답 형식이 JSON 이고
3. 특정 데이터가 응답에 포함되어 있는지
응답 구조 살펴보기
우선, 실시간 대기정보 OpenAPI 는 아래와 같은 구성으로 되어 있다

RealtimeCityAir 은 응답 JSON 의 최상위 키이며, 아래 3가지 주요 속성을 포함한다
1) list_total_count 는 전체 항목 수를 나타내며 현재 25개의 측정소 정보가 포함되어 있다
2) RESULT 는 API 응답 상태 정보를 나타낸다
INFO-000 이면 정상 처리이고, 오류가 났을 때는 다른 코드와 메세지가 나온다고 한다
3) row 는 실제 대기오염 측정값들이 배열로 들어가 있으며
배열 안의 각 객체는 측정소 (구 단위) 하나에 대한 측정 결과이다
Assert - 검증 포인트
1. assert response.status == 200
API 가 올바르게 동작하고, 서버에서 오류 없이 응답했는지를 확인한다
HTTP 응답 코드가 200 OK 가 아닌 경우 이후 데이터 검증은 의미가 없기 때문에 가장 먼저 확인한다
2. assert "RealtimeCityAir" in data
응답 JSON 구조의 최상위 키가 존재하는지 (예상한 JSON 구조를 따르고 있는지) 확인한다
이 키가 없다면, 응답 형식이 바뀌었거나 오류 응답일 가능성이 있다
3-1. assert "RESULT" in data["RealtimeCityAir"]
3-2. assert data["RealtimeCityAir"]["RESULT"]["CODE"] == "INFO-000"
Result 가 존재하는지와, Result 키가 정상인지 (INFO-000) 확인한다
각각의 Assert 에 Error MSG 를 명시하여, 실패 시 어떤 부분에서 문제가 발생했는지 파악이 용이하게 만든다
4-1. assert "row" in data["RealtimeCityAir"]
4-2. assert len(data["RealtimeCityAir"]["row"]) > 0
이 API 에서 실제 데이터는 모두 row 배열에 포함되어 있기 때문에
row 가 정상 출력되는지와 데이터 존재 여부를 확인해준다
간단한 코드 w/ Python
# 첫번째 측정소 기본 정보 출력
from playwright.sync_api import sync_playwright
def seoul_air_api_test():
with sync_playwright() as p:
request_context = p.request.new_context()
url = "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99"
response = request_context.get(url)
# 응답 상태 코드 확인
assert response.status == 200, f"응답 실패: {response.status}"
# JSON 파싱
data = response.json()
# 최상위 키 확인
assert "RealtimeCityAir" in data, "'RealtimeCityAir' 키가 응답에 없습니다."
container = data["RealtimeCityAir"]
# RESULT 키와 정상 코드 확인
assert "RESULT" in container, "'RESULT' 키가 응답에 없습니다."
assert container["RESULT"]["CODE"] == "INFO-000", "API 응답 코드가 'INFO-000'이 아닙니다."
# 측정값 row 존재 여부 확인
assert "row" in container, "'row' 키가 응답에 없습니다."
assert len(container["row"]) > 0, "'row' 배열이 비어 있습니다."
# 첫 번째 측정소 데이터 확인 및 출력
first = container["row"][0]
print(f"[{first['MSRSTE_NM']}] 미세먼지(PM10): {first['PM10']}, 상태: {first['IDEX_NM']}")
# 미세먼지 수치 검증
assert first["PM10"] < 150, f"미세먼지 수치 비정상: {first['PM10']}"
# 등급 값 유효성 검증
valid_grades = ["좋음", "보통", "나쁨", "매우나쁨"]
assert first["IDEX_NM"] in valid_grades, f"예상하지 못한 등급: {first['IDEX_NM']}"
request_context.dispose()
if __name__ == "__main__":
seoul_air_api_test()
Playwright 로 API Test 를 한다면, Postman 처럼 결과를 시각화해 주는 기능은 없지만
테스트 코드 내에서 논리 조건을 유연하게 걸고, 실제 동작 흐름을 통합할 수 있다는 장점이 있다
UI 자동화와 API Test 를 한 환경에서 통합 관리할 수 있고
API 응답의 구조나 값의 유효성을 Assert 할 수 있어 기준 기반의 정밀한 검증이 가능하다
'TIL > Playwright' 카테고리의 다른 글
| 로그인 인증 상태 저장 및 재사용 방법 w/ Playwright (6) | 2025.08.12 |
|---|---|
| Playwright Python: Tutorial #5 - API Testing (0) | 2025.02.28 |
| Playwright Python: Tutorial #4 - Browser Context (0) | 2025.02.27 |
| Playwright Python: Tutorial #3 - Test Generator (0) | 2025.02.24 |
| Playwright Python: Tutorial #2 - Pytest (0) | 2025.02.21 |