REST API를 시뮬레이션하는 방법?


13

타사 REST API에서 데이터를 쿼리하는 새 프로젝트를 진행 중입니다. 실시간 스포츠 데이터 피드 용이므로 게임이 실제로 진행 중일 때만 피드가 작동합니다.

타사가 좋은 문서 (XSD 등)를 제공하지만 게임 진행을 시뮬레이션 할 수있는 방법이 없으므로이 API에 대해 작성한 코드를 테스트하려면 실제 게임이 발생할 때까지 기다려야합니다.

내 유일한 수단은 내 자신의 게임을 시뮬레이션하는 코드를 작성하는 것이지만 많은 작업처럼 보입니다. 어떻게 접근하겠습니까?


5
이 데이터는 얼마나 복잡합니까? 대부분의 경우 들어오는 데이터를 처리하는 개체를 스텁합니다. 이전 게임 세션의 데이터를 사용하거나 (테스트하기에는 너무 복잡 할 수 있음) 데이터를 분석하고 관련 유형의 정보를 추출하십시오. 이것을 파일에 저장하고 마치 실제 소스에서 온 것처럼 주 프로그램에 피드하십시오.
thorsten müller

2
모의 objecthttp위한 완벽한 유스 케이스 : //en.wikipedia.org/wiki/Mock_object
케빈 클라인

답변:


15

이것은 모의 객체에 대한 완벽한 사용 사례입니다 . 모든 대중 언어에 대한 조롱 라이브러리가 있습니다. 테스트 데이터를 리턴하기 위해 REST 서비스 응답을 제공하는 오브젝트를 모방하려고합니다. 테스트 데이터를 수동으로 생성하거나 라이브 시스템에 대한 이전 호출에서 수집 할 수 있습니다.


1
여기서 문제는 코드의 많은 것이 아닙니다. 데이터 중 하나입니다. 나는 API의 모의 객체 또는 스텁을 조롱 할 수 있지만, 문제는 저를 줄 것이다 가짜 데이터를 생성하는 것입니다
dferraro

@ dferraro : 다음에 게임을 할 때 서비스를 폴링하고 해당 데이터를 파일로 덤프하지 못하게하는 것. 그렇게 할 수 있고 형식에 익숙해지면 특정 테스트 사례를 사용하여 새 파일을 만들 수 있습니다.
Steven Evers

4

게임이 일어날 때까지 기다리십시오. 피드에서 모든 이벤트를 캡처하십시오. 적절한 시간에 이벤트 를 재생 하는 시뮬레이터를 작성하십시오 . Voila, 실제 데이터가있는 피드 시뮬레이터가 있습니다.


Ruby 사용자 인 경우 VCR 을 사용 하여 HTTP 응답을 캡처하고 재생할 수 있습니다 .
dusan

2

나만의 시뮬레이터를 작성하는 것이 좋습니다. 이를 사용하여 모든 종류의 시나리오를 테스트 할 수 있습니다.

  • 서버가 연결을 수락하지만 응답하지 않습니다
  • 서버 시간 초과
  • 서버는 가비지 회신 등을 다시 보냅니다.

과거에이 작업을 수행했을 때 요청 메시지에 "특수"값을 사용하여 시뮬레이터에 필요한 작업을 수행하라는 메시지를 표시했습니다. 또한 개발 환경을 벗어나지 않고도 종단 간 테스트를 실행할 수 있습니다.

편집 : 예를 들어 프로젝트가 XML을 타사 서비스에 제출하는 경우 요청에 예가 포함될 수 있습니다 <value>50.00</value>. 시뮬레이터는 50.00 => 분해, 60.00 => 가비지, 70.00 => 연결 닫기 등으로 코딩 (또는 더 나은 구성) 될 수 있습니다. 시뮬레이터의 동작은 각 테스트 사례에서 제어하는 ​​입력에 따라 달라집니다.


감사. '특별한'가치에 대한 당신의 의미에 대한 예를들 수 있습니까?
dferraro

1
내 대답을 정교하게 만들었습니다.
Rory Hunter

2

북 메이커 가 일부 샘플 데이터를 제공하고 (통합 단계에서 저장 될 수 있음) 고려할 때 이러한 피드를 다음과 같이 구성하는 것이 좋습니다.

  • 이벤트 목록
  • 예정된 이벤트에 대한 업데이트
  • 승률 업데이트
  • 결과

공급자는 푸시 (POST) 및 풀 (GET)의 두 가지 업데이트 유형을 제공 할 수 있습니다.

이 시점에서 당신은

  1. 프로그래머가 알고리즘을 정교하게 만들 수 있도록 GET 요청 만 처리하는 간단한 서버를 만드십시오.
  2. 동일한 정보의 제출을 ​​관리하는 자동화를 작성하여 시스템에 스트레스를 줄 수 있습니다.

개발 및 테스트 관리

사용할 기술의 세부 사항에 들어 가지 않고도 4 개의 URL (또는 공급자가 제공하는 내용에 따라 필요한 URL)에만 응답 하는 미니 서버미니 푸시 서비스를 얻을 수 있습니다.

"미니 서버"로 작업 할 때 명심해야 할 것은 HTTP 프로토콜의 핸들러입니다. 포트 80에서 서버를 작성하는 것은 매우 간단하며 문제를 해결합니다. 공급자가하는대로 GET 응답에 모든 정보를 주입해야합니다 (제작시 문제가 발생하지 않음).

개인적으로 나는 할 것이다 간단한 펄 서버 또는 동일 하지만 Nodejs으로합니다. 데이터 주입과 관련하여 오프라인 브라우저 ( CURL , WGET ) 를 호출하는 타이머가 충분합니다.


2

프록시 서버를 127.0.0.1로 설정 http-proxy하고 nock거기에 node.js 프로세스를 연결하여 cucumberjs, phantomjs의 조합을 사용하여 REST API를 시뮬레이션 했습니다. CucumberJS는 중요한 부분이 아니므로 테스트 시나리오를 작성할 수 있으며 나머지는 시뮬레이션의 핵심입니다. match-request-return-data를 사용하여 간단하게 조롱 할 수 있지만 패턴 및 후크 콜백 함수로 필터링하여 응답을 생성 할 수 있으므로 필요한 세분화 수준으로 시뮬레이션 할 수 있습니다. 전체 데모 서버이지만 점진적으로 수행 할 수 있습니다).

그것은 잘 작동합니다 :

  1. Phantomjs는 URI를 요청합니다.
  2. 요청이 127.0.0.1:port의 프록시 서버로 이동합니다.
  3. node.js 프로세스는를 사용하여 투명하게 전달 http-proxy합니다. 따라서 모든 "정상적인"로딩 (페이지, 이미지)이 작동합니다.
  4. 일부 요청 (주로 API)을 가로 채기로 선택한 경우 nock이를 사용 합니다.

내 시나리오에서는 동일한 프로세스에서 오이 js 테스트와 결합하여 다음과 같이 진행했습니다.

  1. 시운전.
  2. nock테스트하는 시나리오를 위해 HTTP 조롱을 설정합니다 .
  3. Selenium 프로토콜을 통해 phantomjs로 페이지를로드합니다.

나머지는이 단락의 앞 부분에 표시된 것과 같습니다 (즉, 약간의 사이클입니다. 테스트 러너는 phantomjs에게 페이지를로드하도록 지시하여 모든 요청을 다시 전달하고 인터넷으로 전달합니다) 테스트 된 API 인 경우).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.