REST 서버에 대한 REST 클라이언트 테스트 비품을 수행하는 방법?


10

단위 테스트를 작성할 때 일반적으로 고정구를 사용하는 것이 일반적입니다. 테스트 가능한 데이터가 거의 없으므로 다음과 같이 말할 수 있습니다. 1. 모든 고객에게 Willy Wonka를 포함시켜야합니다. 2. 클라이언트 3을 삭제하고 이제 클라이언트에 더 이상 Willy Wonka를 포함시키지 않아야합니다.

단위 테스트에는 좋습니다. setup / teardown을 사용하여 조명기를 다시로드하거나 트랜잭션을 롤백하십시오. 따라서 테스트 작성, 업데이트 및 삭제는 트랜잭션 내부에서 수행됩니다 . 새로운 임시 데이터는 해당 테스트 기간 동안 만 지속 된 다음 재설정됩니다.

그러나 REST 서버와 REST 클라이언트를 분리 한 경우는 어떻습니까?

REST 클라이언트가 올바르게 읽는 것이 아니라 올바르게 작성, 업데이트 및 삭제하는지 확인하고 싶습니다.

원격 테스트 REST 서버에 대해이 작업을 수행하는 방법에 대한 예나 제안을 찾을 수 없습니다 .

조명기 만 제공하는 테스트 REST 서버가 있다고 가정합니다. HTTP의 상태 비 저장 특성은 "BEGIN TRANSACTION"및 "ROLLBACK TRANSACTION"또는 "FLOADTURE FIXTURES"유형의 메시지를 보내는 것이 어렵다는 것을 의미합니까?

나는 이것을하기를 가장 먼저 할 수 없기 때문에 이것에 대해 다른 생각을해야한다는 느낌이 든다.

어떤 제안?


아마도 테스트 서버이기 때문에 조명기를 다시로드 할 엔드 포인트를 가질 수 있습니까?
David Radcliffe

테스트 서버를 사전 정의 된 상태로 되 돌리는 것이 주된 문제라면 "RELOAD TESTDATA"와 같은 특수 테스트 기능을 나머지 API에 추가하여 원하는 작업을 수행하지 않겠습니까? 물론 프로덕션에서는 API 호출을 사용할 수 없는지 확인해야합니다.
Doc Brown

답변:


7

소프트웨어 시스템은 이상적으로 시스템 경계와 인터페이스가 명확하게 정의되어 있습니다. REST 서비스가 이에 대한 좋은 예입니다.

이를 위해, 나는 추천 에 대해 당신이하려는 일을.

구체적으로 특별히:

REST 클라이언트가 올바르게 읽는 것이 아니라 올바르게 작성, 업데이트 및 삭제하는지 확인하고 싶습니다.

내가 대신 제안하는 것은 다음과 같습니다.

  • 특정 입력 및 출력에 대해 올바르게 작동하는지 확인하기 위해 REST 클라이언트에 대한 테스트 빌드 양호 (예상) 및 불량 (예상) 값을 고려하십시오.

  • 의도 한 기능에 따라 작동하도록 REST 서비스에 대한 테스트 빌드 (제어하는 경우)

  • 테스트를 문제 영역에 가깝게 유지하여 해당 상황에서 중요한 사항의 설계 및 개발을 안내 할 수 있습니다.


3
통합 테스트에 대한 모든 아이디어를 여기에서 아주 무시하십시오. 나는이 접근법이 실제로 정보를 얻지 못한다고 생각합니다.
febeling

모든 유용한 제안에 감사드립니다. 또한 Twitter를 통해 Ruby gem "webmock"을 시도하고 REST API 서버 응답을 모방하는 것과 비슷한 훌륭한 제안을 받았습니다. 또한 "설명"에 설명하고있는 내용이 통합 테스트에 가깝기 때문에 따로 살펴볼 것입니다. 다시 한번 감사드립니다. - 데릭
sivers

API를 조롱하면 문제를 해결하는 좋은 방법입니다. 그러나 조롱 된 API == 실제 API인지 어떻게 확인합니까?
FrEaKmAn

4

명심해야 할 두 가지 각도 :

  • 코드 나 배관 테스트 중입니까? 잘 알려진 서비스 및 클라이언트 스택을 사용한다고 가정하면 테스터를 안전하게 추정 할 수 있으며 수천 명의 사용자가 일반적으로 기초에 근본적인 버그가 없는지 확인합니다.
  • 왜 테스트가 dem 등성이 아닌가? 프로덕션 이외의 데이터를 쓰거나 다른 엔드 포인트에 쓸 수있는 방법을 만드십시오. 예측 가능한 이름 지정 패턴을 선택하십시오. 테스트 전에 나머지 서버 DB를 미리로드하십시오. 그리고이를 가능하게하는 몇 가지 방법이 더있을 것입니다. 방법은 실제로 전술적이며 앱의 특성에 따라 달라집니다.

2

REST 서버 응답을 가짜로하는 것이 클라이언트를 테스트하는 가장 좋은 방법이라고 생각합니다.

Ruby의 경우 가짜 응답을내는 데 사용할 수있는 FakeWeb gem이 있습니다 ( https://github.com/chrisk/fakeweb) .

- 또한, 자바 스크립트에서 당신은 당신에게 가짜 서버를 제공하는 Sinon.JS 같은 것을 사용할 수 있습니다 http://sinonjs.org/docs/#fakeServer을 .


1

다른 사람들이 말했듯이 클라이언트를 테스트하는 경우 서버에서 작성, 삭제 등을 할 필요가 없습니다. 서버를 전혀 조롱 할 필요조차없는 경우가 많습니다. 루비, 파이썬, PHP 등으로 작성 되었든, 어떤 시점에서 클라이언트가 HTTP 라이브러리의 메소드를 사용하여 올바른 요청을하고 응답을 올바르게 처리하는지 확인해야합니다. 요청과 그 메소드를 조롱하고 호출 방법을 확인하고 테스트 결과를 반환하기에 충분합니다.

urllib2요청을 하는 데 사용하는 가상의 파이썬 클라이언트를 사용하십시오 . 클라이언트에 메소드가있을 수 있습니다. get()호출 urllib2.Request()하십시오. 당신은 정말로 자신의 클래스에 대한 호출을 조롱해야합니다 get().

@patch('your.Client.get')
def test_with_mock(self, your_mock):
    your_mock.return_value({'some': 'json'})
    test_obj = your.Client.get_object(5)
    your_mock.assert_called_with('/the/correct/endpoint/5')

이 매우 간단한 예제는 Python의 Mock 라이브러리를 사용하여 일부 API에서 무언가를 얻기 위해 올바른 URL을 생성 your.Client하는 get_object()메소드 로 가상 클래스 를 테스트합니다 . 요청을하기 위해 클라이언트는 해당 get()URL로 메소드를 호출합니다 . 여기서 해당 메소드는 조롱되고 ( your.Client.get"패치"되어 제어 됨 your_mock) 테스트는 올바른 엔드 포인트가 요청되었는지 확인합니다.

your_mock.return_value모의 메소드는 클라이언트가 처리해야하는 구성된 JSON 응답 ( )을 리턴 하며 예상 된 방식으로 예상 데이터를 처리했는지 테스트하기 위해 추가 어설 션을 작성합니다.


그러나 "올바른"요청을 할 때 실제 (제작중인) 요청임을 어떻게 확신하십니까? 귀하의 제안을 이해하면 API가 변경되거나 중단되면 테스트가 계속 작동합니다. 프로덕션 환경에서는 완전히 다른 이야기입니다.
FrEaKmAn

1

설명하는 것은 통합 테스트 시나리오입니다. 이들은 일반적으로 설정 및 해체에 약간 어색합니다. 그것은 달리기를 느리게하고 종종 부서지기 쉽습니다.

조명기를 사용한 접근 방식은 어색하고 어색하지만, 일부 프레임 워크 (예 : Rails)와 관련된 기본 방법이며 이미 지원됩니다. 조명기를 사용하여 데이터베이스를 준비하려면 추상 테스트 사례 또는 이와 유사한 것이 필요합니다. (레일즈에서 테스트 카테고리의 비정상적인 이름 지정을 조심하십시오. DB 픽스처를 사용한 단위 테스트는 통합 테스트도 엄격히 말하고 있습니다.)

시나리오에 대한 방법은 API 응용 프로그램 상태 또는 데이터베이스에 대한 테스트 별 제어 권한을 갖도록하는 것입니다. 테스트 환경에만있는 설정 및 해제에 대한 추가 엔드 포인트를 가질 수 있습니다. 또는 응용 프로그램 / API 뒤의 데이터베이스 (또는 사용중인 모든 내용)와 대화 할 수 있습니다.

이것이 (부당한 의미에서) 너무 많은 노력이라고 생각되면, 데이터베이스를위한 픽스처 접근 방식은 데이터베이스 또는 애플리케이션 상태를 조작하기 위해 테스트에 특정한 추가 수단을 사용하는 것만 고려하십시오.

그러나이 토론이 HTTP의 상태 비 저장 특성과 관련이 있다고 생각하지 않습니다. HTTP는 상태가 없지만 대부분의 경우 응용 프로그램이 아닙니다. REST 엄격 성을 찾는 곳은 약간 비슷합니다. 모든 자원을 완전히 작성 가능하고 읽기 가능하며 삭제할 수 있습니다. 이 경우 일반적인 API 수단을 통해 모든 설정 및 분해를 수행 할 수 있습니다. 그러나 실제로는 테스트 환경 외부가 아닌 응용 프로그램에 대한 비즈니스 이해의 특정 작업을 포함하고 싶지 않기 때문에 실제로는 수행되지 않습니다.


1

원숭이 패치

내 작업에서 우리는 종료 xUnit 프레임 워크와 클라이언트와 서버 사이의 원숭이 패치 네트워크 호출을 사용하여 ATDD를 수행합니다. 동일한 프로세스 공간에서 클라이언트를로드하고 네트워크 호출을 REST 서버 스택 코드의 맨 위에 패치합니다. 그런 다음 모든 호출은 일반적으로 클라이언트에서 발행되고 서버 코드는 정상적으로 표시되는대로 요청을 가져옵니다.

혜택

  • 서버가 없기 때문에 서버 시작과 동기화 할 필요가 없습니다.
  • 고정 장치와 같은 것을 관리하기 위해 고전적인 단위 설정 및 분해 방법을 활용
  • 테스트를보다 세밀하게 제어하기 위해 목업 / 스텁 및 기타 원숭이 패치를 사용하는 기능
  • xUnit 프레임 워크를 사용하여 작성할 수 있습니다

트레이드 오프

  • 다중 프로세스 상호 작용 / 문제 (잠금, 리소스 부족 등)를 노출시키지 않습니다.
  • 다중 서버 문제를 노출시키지 않습니다 (데이터 직렬화, 클러스터링 스타일)
  • 네트워크 문제가 시뮬레이트되기 때문에 노출되지 않습니다 (액세스, 시간 초과 오류 등)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.