Python API 테스트 자동화 프레임워크(섹션 2)에서 HTTP 요청 생성


제목 이미지의 로고 출처: Python, Requests, JSON, HTTP
이것은python을 사용하여 API 프레임워크를 구축하는 방법에 관한 시리즈의 두 번째 편입니다.
섹션 1 읽기

테스트의 API 이해


이 자습서에 사용된 API에 대해 자세히 살펴보겠습니다.
우리는 people-api을 사용할 것이다. 이것은 CRUD HTTP 작업으로 Python Flask, SQLAlchemy 개발을 사용하고 sqlite를 데이터베이스로 사용하여 이름, 성, id가 있는 인원 목록을 나타낼 것이다.
github에서 clone people api repo를 설정하고 다음 명령을 실행하여 pipenv를 활성화합니다.
pipenv shell

완료 후 실행을 통해
python build_database.py

이것은 로컬 qlite 데이터베이스에 가상 기록을 삽입할 것이다
마지막으로 테스트를 수행하고 테스트 중에 계속 실행되도록 하여 로컬에서 HTTP 서비스를 시작합니다
python server.py

로그에서 로컬 서비스가 시작되었고 서버에 요청한 로그도 볼 수 있습니다
* Serving Flask app "config" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 105-008-664

애플리케이션을 보기 위해 http://0.0.0.0:5000으로 이동합니다.

Note: To see the swagger spec for this API we can navigate to http://0.0.0.0:5000/api/ui/#/


보시다시피 이 API는 기본적인 CRUD 작업을 지원합니다. (생성, 읽기, 업데이트, 삭제)

만약 당신이 이 요청을 처리하고 싶다면, 나는 postman 폴더 아래의 환매 협의에 우체부 집합을 추가했는데, 이 모든 기본적인 조작은 이미 설정되어 있다.
API는 한 사람을 만들고, 그 사람/그 사람을 업데이트하고, 이 사람을 삭제하며, 데이터베이스에서 한 명 또는 모든 사용자를 읽을 수 있도록 지원합니다.우리는 테스트를 작성할 때 이 조작들을 볼 것이다.

GET API를 통한 첫 번째 테스트


가져온 requests 모듈을 사용하여 기본 테스트를 만들고python을 통해 HTTP 요청을 보내는 방법을 보여 줍니다
이 API의 회전 각도는 다음과 같습니다.
curl --location --request GET 'http://0.0.0.0:5000//api/people' \
--header 'Accept: application/json'

다음은 기본적인 HTTP GET 요청을 연결한 코드 세션입니다. 이 서비스는 200 상태 코드를 우리에게 되돌려준다고 단언하고 되돌아오는 인원 목록에는 kent이 포함되어 있습니다.assert_that 모듈의 assertpy을 사용하여 유창한 단언을 하였습니다. 이 모듈의 실패 소식은 읽을 수 있기 때문에 앞으로의 게시물에서 이에 대해 더 많은 토론을 진행할 것입니다.pipenv install assertpy을 사용하여virtualenv에 설치되었는지 확인하십시오
import requests
from assertpy.assertpy import assert_that
from config import BASE_URI

def test_read_all_has_kent():
    # We use requests.get() with url to make a get request
    response = requests.get(BASE_URI)
    # response from requests has many useful properties
    # we can assert on the response status code
    assert_that(response.status_code).is_equal_to(requests.codes.ok)
    # We can get python dict as response by using .json() method
    response_text = response.json()
    first_names = [people['fname'] for people in response_text]
    assert_that(first_names).contains('Kent')

위에서, 우리는 BASE_URI 변수를 사용하여 사용할 기본api URL을 가져옵니다.다음과 같이 config.py 파일에 저장됩니다.
BASE_URI = 'http://0.0.0.0:5000/api/people'

POST 방법을 사용하여 한 사람 만들기


알겠습니다. GET API의 기본적인 상황을 처리했습니다. POST 요청을 어떻게 보내는지 봅시다.
일반적으로 Rest API에서는 리소스를 만들려는 경우 POST 메서드를 사용합니다.
다음은 요청을 보내는 cURL입니다. 우리python 코드는 같은 헤더, 주체, URL을 제공하여 요청을 명중시킬 것입니다
curl --location --request POST 'http://0.0.0.0:5000//api/people' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
   "fname": "TAU",
   "lname": "User"
 }'

다음은 우리가 자동화하고자 하는 완전한 절차이다.
  • 데이터베이스
  • 에 새로운 사람 만들기
  • GET API
  • 을 사용하여 새로 만든 사용자가 있는지 확인
  • 필터링을 통해 생성된 데이터가 시스템의 모든 사용자에게 있는지 확인
  • 여기는 LN2:calls create_new_person()입니다. 우선 요청의 일부분으로 전달할 주체를 만듭니다.
    LN14에서 우리는 dumps() 모듈의 json 방법을 사용하여python dict를 json 문자열(서열화)으로 변환하고 str(uuid4())을 사용하여 LN13에서 유일한 성씨를 얻어 매번 테스트 실행 중 충돌하는 데이터가 없도록 합니다
    마지막으로 우리는
    response = requests.post(url=BASE_URI, data=payload, headers=headers)
    
    
    그리고 POST 방법을 사용하여 데이터베이스에 새로 만든 사용자가 있는지 확인합니다

    Delete 메서드를 사용하여 누군가를 삭제합니다.


    우리는 어떻게 delete 방법을 사용합니까?
    이 API에서 우리는 search_created_user_in()을 전달하여 한 사람을 삭제할 수 있다. 삭제 작업을 시도하기 전에 기존의 데이터를 사용하지 않고 자신의 테스트 데이터를 만들 수 있다. 이것은 항상 좋은 방법이다. 왜냐하면 이것은 비확정적인 테스트를 초래할 수 있기 때문이다.
    다음은 프로세스입니다.
  • 새로운 사람 만들기
  • 읽기 API
  • 으로 인원 id 얻기
  • 클릭 단점 삭제 및
  • 단언
    사용자를 만들고 읽는 방법이 있기 때문에 나머지 유일한 방법은 person_id이 API 경로 매개 변수에서 전달되는 것을 확보하여 삭제 작업을 실현하는 것입니다. 우리는 기묘한 person_id으로 우리의 URL을 만들고 f-strings 방법으로 삭제를 클릭합니다.
    def test_created_person_can_be_deleted():
        persons_last_name = create_new_person()
    
        peoples = requests.get(BASE_URI).json()
        newly_created_user = search_created_user_in(peoples, persons_last_name)[0]
    
        delete_url = f'{BASE_URI}/{newly_created_user["person_id"]}'
        response = requests.delete(delete_url)
        assert_that(response.status_code).is_equal_to(requests.codes.ok)
    
    

    보너스


    주의: 단언에서, 우리는 상태 코드에 수치를 지정하지 않았습니다. 검색 사전을 요청했습니다. 읽을 수 있는 영어와 비슷한 문법으로 쉽게 코드를 지정할 수 있습니다. 이것은 매번 MDN - Mozilla developer network의 코드 X가 무엇을 의미하는지 해석하는 것보다 좋을 것입니다.😉
    다시 말하면, 우리는 그것을 requests.delete()이 아니라 200으로 쓸 수 있다
    assert_that(response.status_code).is_equal_to(requests.codes.ok)
    
    

    결론


    이것은 단지 도서관이 무엇을 할 수 있는 시도일 뿐이다.그것이 제공하는 모든 기능에 대한 더 자세한 정보는 requests docs을 보십시오. 이것은 HTTP 호출을 위해 요청을 어떻게 사용하는지 더 잘 알 수 있기를 바랍니다.다음 글에서는 JSON/XML 데이터 형식과 단언을 어떻게 사용하는지 상세하게 토론할 것이다.기대하세요.⏰
    다음은 MDN에서 읽은 Content-TypeAccept 헤더 파일입니다.
    만약 당신이 이 글이 유용하다고 생각한다면 반드시 친구나 동료와 공유해야 한다. 만약 당신이 생각이 있다면, 나는 트위터에 채팅이나 평론을 기꺼이 할 것이다.다음까지.즐거운 테스트와 인코딩.

    좋은 웹페이지 즐겨찾기