TIL/Playwright

Playwright 로 API Test 해보기 w/ OpenAPI

아람2 2025. 6. 30. 19:01
반응형

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 할 수 있어 기준 기반의 정밀한 검증이 가능하다 

 

반응형