Hasura GraphQL API를 공수도로 테스트

5812 단어 graphqlgraphqltesting

그럼 하수라로 새로운 GraphQL API을 만들었으니 다음 단계는 무엇입니까?
GraphQL API를 변경할 때 응용 프로그램의 모든 내용이 제대로 작동하는지 확인하기 위해 예상되는 질의에 대한 셀 테스트를 작성하는 것이 좋습니다.
GraphQL 엔드포인트와 REST 엔드포인트 세트의 차이를 테스트하는 방법
첫 번째는 네가 의심한 것이다.
REST 끝점은 일반적으로 동일한 자원에 대한 응답을 반환하는 일련의 끝점으로 분해됩니다.
GraphQL에서 쿼리를 사용하여 단점에 접근하는 것을 볼 수 있습니다. (Hasura의 예는 http://yourapplication.com/v1/graphql) 이 쿼리는 선택한 자원을 요청합니다.
이것은 매우 강력하다. 자원을 동태적으로 선택할 수 있기 때문(특히 연결/관계를 바탕으로 하는 자원)은 개발 속도를 높였지만 개발과 생산에서 단원 테스트에 대한 수요도 증가했다.
두 번째 변화는 반응 자체다.
REST 엔드포인트를 질의할 때 일반적으로 요청이 성공했음을 나타내기 위해 응답이 200 (ok) 응답을 생성합니다.REST 기반 도구는 이러한 응답에 특히 의존하는 경우가 많습니다.
이에 비해 GraphQL에서는 일부 정보를 성공적으로 반환하는 동시에 다른 부분에서도 오류를 반환할 수 있다.이것들은 200의 응답으로 되돌아오며 GraphQL JSON 응답에 errors 대상을 포함한다.
세립도 오류 로그 기록에 도움이 되지만, GraphQL API가 200 (ok) 응답 범례 등 다른 범례에 지나치게 의존한다면, GraphQL API를 테스트할 때 작은 문제를 가져올 수 있다.

공수도


이 빠른 강좌에서 우리는 Karate(https://github.com/intuit/karate)를 어떻게 사용하는지 이해할 것이다. 이것은 Intuit가 개발한 소스 테스트 자동화 세트로 Hasura GraphQL API를 테스트하는 데 사용된다.
공수도에는 UI 테스트의 브라우저 자동화부터 병렬 테스트, OCR까지 다양한 기능이 있다. 우리는 더욱 기본적인 API 요청/응답 기능과 멋진 HTML 테스트 보고서를 만드는 능력을 볼 것이다.

개시하다


시작하려면 다음 위치에서 재구매 계약을 다운로드하십시오.
https://github.com/martin-hasura/testing-hasura-api-karate
디렉토리에서 이 명령을 실행하면 샘플 아키텍처와 가상 데이터가 포함된 GraphQL API가 열립니다.
docker-compose up hasura db

공수도 테스트


우리는 여기서 쿤틴 바라스(Quentin Barlas)의 Docker izing 공수도를 사용하여 https://github.com/qbarlas/karate-dsl을 실현한다. 이것은 공식 공수도 용기보다 조금 가볍고 후자는 크롬에서 브라우저 기반 테스트를 하는 비계를 포함한다../karate/tests/testCases.feature에서 우리가 사용할 주요 테스트 파일을 찾을 수 있습니다. (알림: 만약 당신이 VScode를 사용한다면, 실제로는 공수도 확장이 있을 것입니다. 이것은 당신에게 좋은 코드 형식을 제공할 것입니다.)

너의 첫 공수도 공연


일단 우리가 파일에 있으면, 공수도 문법의 각 구역에 대한 설명이 있는 테스트 용례를 발견할 수 있을 것이다.
Feature: Test Hasura Blog Engine GraphQL API

Background:
* url 'http://host.docker.internal:8080/v1/graphql'
이것은 우리가 테스트할 기능의 명칭과 우리가 테스트할 단점을 정의할 것이다.이 예에서 우리는 특성을 만들고 다섯 개의 테스트를 실행할 것이다.

질의 및 변수


Given def query = read('getPosts.gql')
공수도는 파일에서 GraphQL 요청을 읽을 수 있습니다. (이 파일들은 실행 중인 .feature 파일과 비교해서 찾을 수 있습니다.)
And request { query: '#(query)' }

// or

And request { query: '#(query)', variables: '#(variables)' }
그리고 GraphQL 요청에 사용할 변수 대상을 요청에 전달할 수 있습니다.
검색도 내연적으로 작성할 수 있고 사용할 수 있다
``' for linebreaks and increased legibility (an example is in the개의 테스트 용례.기능`).

타이틀


이러한 예에서는 다음과 같이 제목을 전달합니다.


And header x-hasura-admin-secret = 'admin_secret_for_testing'
And header x-hasura-role = 'author'
And header x-hasura-user-id = 1


이것은 우리가 권한 시스템 설정을 검사하기 위해 x-hasura-rolex-hasura-user-id을 모의하는 것을 허용할 것이다. (예를 들어, 우리는 초고 게시물의 테스트 용례를 볼 수 없는 사용자가 있다.)
더 복잡한 용례를 위한 맞춤형 제목에 대한 정보를 읽을 수 있습니다. 예를 들어 동적 제목, 여기: https://github.com/intuit/karate#managing-headers-ssl-timeouts-and-http-proxy, 여기: https://github.com/intuit/karate#configure-headers.

단언


우리는 또 실제로 어떤 것들을 시험하고 싶다.공수도에는 요청한 데이터에 대한 응답을 검사하기 위한 깊은 단언 함수가 있습니다: https://github.com/intuit/karate#payload-assertions


* status 200


우리는 우선 우리의 응답 상태가 200 (ok)으로 되돌아오는지 검사할 수 있다.
이제 앞서 언급한 GraphQL 응답이 200으로 되돌아오는 것이 반드시 모든 것이 정상이라는 것을 의미하는 것은 아니라는 것을 기억하세요.


* match response == "#object"
* match response.errors == '#notpresent'


우리가 여기서 하는 것은 검사 1) 우리의 응답을 대상으로 되돌려주는 것이다. 2) 우리의 응답은 어떠한 오류 대상도 포함하지 않는다.
그런 다음 응답의 일부로 반환되는 실제 데이터를 테스트할 수 있습니다. 예를 들면 다음과 같습니다.


* def postList = response.data.cms_post
* match postList !contains { status : "draft" }


게시물 목록에 초안 게시물이 없습니다.


* def postCount = (response.data.cms_post.length)
* assert postCount >= 1


게시물 목록이 1보다 큽니다.


* def return_obj = response.data.delete_cms_post.returning[0]
* match return_obj contains { title: "karate_test" }


return 대상에는 정확한 일치 항목이 포함되어 있습니다. (이 예에서는 삭제된 댓글입니다.)

실행 테스트


마지막으로 Docker 컨테이너에서 테스트를 실행합니다.
먼저 API가 이전 docker-compose up에서 시작되고 실행되었는지 확인한 후 다음 도구를 사용하여 테스트 키트를 실행할 수 있습니다.


docker-compose up karate


이것은 stdout에서 테스트 결과를 출력하고 프로젝트의 ./karate/results 디렉터리에 새로운 테스트 결과 HTML 보고서를 생성합니다.
테스트 유쾌!

좋은 웹페이지 즐겨찾기