Python API 테스트 자동화 프레임워크(6부) API 응답 스키마 검증
헤더 이미지 소스의 로고: Python , Requests , JSON , HTTP , Cerberus
Python을 사용하여 API 프레임워크를 빌드하는 방법에 대한 시리즈의 여섯 번째 게시물입니다.
아래에서 이전 부분을 읽을 수 있습니다.
대부분의 API는 클라이언트 간에 설정된 일부 계약을 준수하는 JSON을 반환합니다(다른 API 또는 웹 앱 등일 수 있음). 소비자 중심의 계약 테스트를 작성할 수 있지만 때로는 라이브 API로 테스트하고 응답 스키마가 고정 구조를 따르는지 확인하고 싶을 수도 있습니다.
Python 생태계에는 다양한 데이터 유효성 검사 라이브러리가 있으며 목표에 맞는 라이브러리를 선택할 수 있습니다. 이를 위해 꽤 유명한 라이브러리인 Cerberus을 사용할 것입니다. 다른 주목할만한 라이브러리는 jsonschema , voluptuous 등입니다.
설정
virtualenv에 Cerberus 설치
pipenv install cerberus
People API의 읽기 작업에 대한 스키마 테스트
people API의 응답이 우리가 기대하는 스키마를 준수하는지 확인하고 싶다고 가정해 보겠습니다.
아래는 읽기 API를 쳤을 때 얻는 구조입니다.
{
"fname": "Doug",
"lname": "Farrell",
"person_id": 1,
"timestamp": "2020-12-01T16:50:36.842997"
}
Cerberus는 응답 개체 내부의 모든 필드와 해당 유형으로 스키마를 정의하여 작동한 다음 샘플 응답이 실제로 스키마 요구 사항을 충족하는지 확인합니다.
첫 번째 스키마 테스트
아래는 People API의 Read one 작업이 정의된 스키마를 충족하는지 확인하는 테스트입니다.
import json
import requests
from cerberus import Validator
from config import BASE_URI
schema = {
"fname": {'type': 'string'},
"lname": {'type': 'string'},
"person_id": {'type': 'integer'},
"timestamp": {'type': 'string'}
}
def test_read_one_operation_has_expected_schema():
response = requests.get(f'{BASE_URI}/1')
person = json.loads(response.text)
validator = Validator(schema)
is_valid = validator.validate(person)
assert_that(is_valid, description=validator.errors).is_true()
이것이 어떻게 구성되는지 이해합시다.
fname, lname
등과 같은 특정 키와 값이 있는 단일 개체이기 때문에 응답 개체의 예상 스키마를 정의하는 것으로 시작합니다.이러한 스키마 세부 정보를 사용하여 Python dict를 정의할 수 있습니다.
"fname": {'type': 'string'}
여기서 응답의 모든 필드에 대해 필드 이름으로 키를 지정하고 값은 문자열, 숫자, 부울, 날짜 등과 같은 유형을 지정하는 또 다른 사전입니다.
See the full list of types oncerberus docs
다음은 읽기 응답에 대한 스키마 모양입니다.
schema = {
"fname": {'type': 'string'},
"lname": {'type': 'string'},
"person_id": {'type': 'integer'},
"timestamp": {'type': 'string'}
}
그런 다음 예상되는 개인 ID로 GET API를 누른 다음 load()를 사용하여 응답을 python dict로 변환합니다.
response = requests.get(f'{BASE_URI}/1')
person = json.loads(response.text)
Note: Hard coding a user id like 1 (in the request URL) is often something to be avoided. You might want to create a new user and then do this test, however since this API gets seeded with some dummy data, we are following this approach for demo purposes only.
그런 다음 이 스키마로
Validator
클래스의 인스턴스를 초기화합니다. 선택적으로 이 스키마에 모든 키가 필요하다고 지정하려는 경우 키워드 인수require_all=True
를 추가할 수 있습니다. 또는 스키마 자체에서 'required': True/False
를 사용하여 필드 수준에서 이를 지정할 수도 있습니다.validator = Validator(schema, require_all=True)
JSON이 아래 스키마와 일치하는지 평가할 수 있습니다.
is_valid = validator.validate(person)
그리고 Cerberus가 불일치를 발견한 경우 어설션 오류를 발생시키려면 다음을 인쇄할 수 있습니다
validator.errors
.assert_that(is_valid, description=validator.errors).is_true()
현재 people API에 대한 테스트를 실행하면 테스트 통과가 표시됩니다.
실패 시 어떻게 보이는지 확인하기 위해
person_id
의 유형을 number
에서 string
로 변경할 수 있습니다. 그러면 아래 오류 메시지가 표시됩니다. 일치하지 않는 필드와 유효성 검사 실패입니다.AssertionError: [{'person_id': ['must be of string type']}] Expected <True>, but was not.
모두 읽기 작업 테스트
모두 읽기 작업에 대한 이 테스트는 어떻게 보입니까?
def test_read_all_operation_has_expected_schema():
response = requests.get(BASE_URI)
persons = json.loads(response.text)
validator = Validator(schema, require_all=True)
with soft_assertions():
for person in persons:
is_valid = validator.validate(person)
assert_that(is_valid, description=validator.errors).is_true()
본질적으로 우리는 사람 목록을 가져온 다음 이 목록의 모든 레코드에 대해 동일한 유효성 검사를 반복하면서 소프트 어설션으로 래핑하여 모든 유효성 검사 실패가 수집되고 마지막에 인쇄되도록 합니다.
결론
스키마 유효성 검사는 API 자동화 프레임워크에 포함해야 하는 중요한 구성 요소이며 이를 달성하기 위해 Cerberus와 같은 도구를 사용하는 방법에 대한 기본적인 이해가 있기를 바랍니다. 이해를 위해 이 접근 방식의 모든 뉘앙스는 사용 가능한 많은 기능을 나열하는 Cerberus 문서를 깊이 파고들 수 있습니다.
이 게시물이 유용하다고 생각되면 친구나 동료와 공유하고 생각이 있으면 트위터나 댓글에서 기꺼이 채팅하겠습니다. 다음 시간까지. 행복한 테스트.
추가 읽기:
Reference
이 문제에 관하여(Python API 테스트 자동화 프레임워크(6부) API 응답 스키마 검증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/automationhacks/python-api-test-automation-framework-part-6-api-response-schema-validation-5gdn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)