wiremock tutorial introduction wiremock
이 소개 비디오 튜토리얼은 Wiremock의 기능과 Wiremock을 독립형 서버 및 JUnit 테스트의 일부로 실행하는 방법을 설명합니다.
이 튜토리얼에서는 Wiremock 도구에 대한 기본 개념과 세부 사항을 다룰 것입니다. 요구 사항에 따라 JUnit 테스트 내 에서뿐만 아니라 독립형 HTTP 서버로 사용할 수 있습니다.
이것은 오픈 소스이며 훌륭한 기여자 커뮤니티를 가지고 있기 때문에 많이 사용되는 도구입니다. 서비스 가상화 도구 범주에 속합니다.
학습 내용 :
Wiremock이란 무엇입니까?
간단히 말해서 Wiremock은 통합 테스트를위한 모의 설정입니다. 주어진 요청에 대해 예상되는 응답을 반환하도록 고도로 구성 할 수있는 단순한 모의 서버입니다.
시스템 또는 서비스가 하나 또는 여러 외부 또는 내부 종속성 / 서비스와 통신하는 동안 개발 중에 널리 사용되며 통합 테스트 중에 더 중요합니다.
일반적인 통합 테스트에 대해 더 많이 이해하고 Wiremock이 이러한 문제를 극복하고 우리의 삶을 더 쉽게 만드는 데 어떻게 도움이되는지 알아 보겠습니다.
일반적으로 통합이라는 단어가 나올 때 우리에게 충격을주는 것은 두 통신 시스템 간의 종단 간 통합입니다. 이제 작업을 수행하기 위해 일부 외부 서비스를 사용하는 테스트중인 애플리케이션의 관점에서 살펴 보겠습니다.
예를 들어, 온라인 여행 또는 발권 시스템을위한 애플리케이션을 구축 중이고 Indian Railways에서 제공하는 외부 API에 연결되는 PNR 상태 확인 모듈이 있다고 가정 해 보겠습니다.
이제 애플리케이션을 외부 API와 통합 테스트하려면 어떻게해야합니까?
이를 수행하는 두 가지 방법이 있습니다.
- 먼저, 단위 테스트 접근 방식으로, 제공된 (또는 사내에서 만든) 인터페이스를 스텁하여 시스템이 외부 API에 도달하기 전에 스텁 또는 가짜 응답을 테스트 / 검증합니다. 이것은 외부 종속성을 조롱하려는 단위 테스트에 불과합니다.
- 둘째 외부 종속성의 일부 테스트 환경 (또는 실제 프로덕션 환경)으로 테스트하고 있습니다. 그러나 이러한 접근 방식에는 다음과 같은 몇 가지 문제가 있습니다.
- 외부 API 시스템을 항상 사용할 수있는 것은 아닙니다. 즉, 우리는 외부 시스템에 크게 의존하거나 의존하고 있으며 다운 타임은 테스트 및 개발 / 출시 프로세스에 간접적으로 영향을 미칩니다.
- 둘째, 외부 API에는 테스트 환경이있을 수도 있고 없을 수도 있습니다. 예를 들어, PNR 상태 확인 API는 응답을 가져오고 반환하기 위해 항상 실제 PNR 번호를 요구할 수 있습니다.
- 많은 경우 API를 사용하는 데 드는 비용이 있습니다. 예를 들면 PNR 확인 API가 요청 1,000 개당 Rs 100을 청구한다고 가정합니다. 통합 테스트는 일반적으로 모든 회귀 동안 (그리고 대부분의 경우 모든 커밋에서) 실행되므로 테스트 목적으로도 비용이 드는 API를 사용하는 것은 비용 효율적인 솔루션이 아닐 수 있습니다.
- 원하는 응답을 반환하도록 외부 API를 구성 할 수 없습니다. 가능하더라도 다양한 요청 입력에 대해 서로 다른 응답을 보장하기 위해 많은 테스트 데이터를 만들어야합니다.
예를 들어, API가 서로 다른 유형의 데이터에 대해 서로 다른 상태 코드를 반환하는 것과 같은 오류 시나리오를 테스트하려고합니다. 이제 대응이 우리의 통제하에 있지 않기 때문에 가능한 다양한 시나리오 또는 결과를 검증하기 위해 여러 데이터 세트를 생성해야합니다.
아래 다이어그램을 통해 이러한 개념을 이해해 보겠습니다.
여기서 우리는 외부 의존성의 실제 구현을 사용하는 모의 서버없이 그리고 의존성에 대해 수신 된 요청에 대한 응답을 모의하는 모의 서버 (Wiremock)를 사용하는 통합 테스트의 두 가지 접근 방식을 비교합니다.
후자의 경우 실제 종속성 구현에 대한 종속성과 의존도를 크게 줄이고 품질 및 배송 일정에 영향을주지 않으면 서 많은 구성 기능을 제공합니다.
Wiremock은 주어진 요청에 어떻게 응답합니까?
아시다시피 Wiremock은 프로그래밍 방식의 Mock 서버입니다. 주어진 요청에 응답하는 방식은 모든 관련 매핑 (또는 모의 응답)을 'mappings'라는 폴더에 저장하는 것입니다.
들어오는 요청을 저장된 매핑과 일치시키는 Wiremock의 matcher 구성 요소가 있으며 성공적인 일치가 반환되면 주어진 요청에 대한 응답으로 첫 번째 일치가 반환됩니다.
독립 실행 형 버전의 Wiremock을 사용하는 경우 Wiremock 서버를 실행하면 Wiremock install / jar 위치 디렉토리에 생성되는 mappings 폴더가 표시됩니다.
비디오 자습서 : Wiremock 도구 소개
애니메이션을 온라인으로 볼 수있는 최고의 웹 사이트
Wiremock을 사용하는 방법?
이제 통합 테스트에서이 도구를 어떻게 사용할 수 있는지 살펴 보겠습니다.
다음과 같은 방법으로 사용할 수 있습니다.
독립형 Wiremock 서버
독립형 서버로서 Wiremock에 대한 Maven / Gradle 종속성이있는 간단한 Java 애플리케이션을 생성하고 실행중인 프로세스로 유지할 수 있습니다.
일부 컴퓨터에서 독립 실행 형 서버를 호스팅하고 전체 프로젝트 또는 팀을위한 단일 모의 서버로 사용하려는 경우 좋은 대안입니다. 독립형 모드에서이 도구는 사용 가능한 독립형 jar를 다운로드하여 실행할 수도 있습니다. 여기 항아리를 실행하기 만하면됩니다.
예를 들어, Wiremock 독립 실행 형 인스턴스를 클라우드 또는 온 프레미스 서버의 일부 서버에 배포하려는 경우이 jar를 실행하고 시스템 IP를 사용하여 호스팅 서비스로 사용할 수 있습니다.
좀 보자 독립 실행 형 모드에서 실행하는 단계 (및 포트, 매핑 폴더 등과 같은 다른 항목 구성)
#1) 다른 JAR 파일 (Wiremock jar 설치 디렉토리에서)과 마찬가지로 터미널 (또는 Windows 사용자의 경우 명령 프롬프트)에서 Wiremock jar를 실행하십시오.
java -jar wiremock-standalone-2.25.1.jar
#두) 기본적으로 Wiremock은 localhost : 8080에서 실행되며 (포트를 사용할 수있는 경우 위의 명령은 독립 실행 형 모드에서 Wiremock 서버를 시작합니다) 아래와 같은 출력이 표시됩니다.
#삼) 이제 서버가 시작되면 localhost : 8080의 모든 URL을 방문 할 수 있습니다.
예를 들어, http : // localhost : 8080 / get / user / 1 – 현재 설정중인 모의가 없으므로 아래와 같은 응답을 받게됩니다.
# 4) 이제이 URL에 대한 간단한 스텁 / 모의를 설정하고 URL을 다시 입력 해 보겠습니다. 그런 다음 동일한 URL을 입력하면 이제 모의 또는 스텁 응답이 반환되는지 확인합니다.
curl -X POST --data '{ 'request': { 'url': '/get/user/1', 'method': 'GET' }, 'response': { 'status': 200, 'body': 'Here it is!
' }}' http://localhost:8080/__admin/mappings/new
먼저이 CURL 요청을 이해해 보겠습니다.
- http : // localhost : 8080 / __ admin / mappings / new에 대한 CURL POST 요청을 만들고 있습니다. 이제 JAR 파일을 통해 실행 / 시작한 Wiremock 서버에 대한 모든 매핑이 저장 될 위치입니다.
- Curl 요청에서는“response”섹션의 응답 본문과 함께 URL 및 요청 방법과 같은 요청 매개 변수를 정의합니다. 이는 단순히 GET 요청이 URL / get / user / 1로 들어올 때마다 지정된 응답 본문으로 응답한다는 것을 의미합니다.
# 5) 스텁 응답이 설정되면 (위의 curl 요청의 도움으로) URL을 입력하여 Wiremock에서 스텁 응답을 받는지 확인할 수 있습니다.
브라우저에서이 URL을 입력 해 봅시다 – http : // localhost : 8080 / get / user / 1
매핑이 성공적으로 설정되면 아래와 같은 응답을 받아야합니다.
JUnit 규칙 구성으로 JUnit 테스트와 함께
Wiremock 서버는 JUnit 규칙 설정으로 JUnit 테스트와 함께 사용할 수 있습니다. 이를 통해 JUnit은 Wiremock 라이프 사이클 (예 : Wiremock 시작 및 중지)을 처리합니다.
Eclipse 용 C ++ 컴파일러
대부분 테스트 후 서버를 시작하고 중지하려는 설정에서 사용됩니다.
여러 사람이 동일한 서버를 사용하고 서로의 스텁 응답을 밟을 수있는 독립형 설정과 달리 격리된다는 고유 한 장점이 있으며 구성 가능성이 높습니다.
이 접근 방식의 작동 예를 살펴 보겠습니다.
#1) Wiremock 서버에 대한 JUnit 규칙을 작성하십시오. 이 단계는 본질적으로 JUnit 실행자에게 매 테스트 전에 Wiremock 서버를 인스턴스화하고 매 테스트 후에 서버를 중지하도록 지시하는 테스트 설정 단계와 같습니다.
이것이 의미하는 바는 JUnit 실행기가 명시 적으로 수행하지 않고도 Wiremock 서버를 시작하고 중지하는 작업을 처리한다는 것입니다.
@Rule public WireMockRule wm = new WireMockRule(wireMockConfig().port(8080));
#두) 이제 원하는 엔드 포인트에 대해 요청을 실행하기 위해 먼저 클라이언트 (okHttp 사용)를 만드는 테스트를 작성합니다.
// execute request through http client OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url('http://localhost:8080/test/abc') .get() .build();
#삼) 그러나 여기에서 Wiremock 인스턴스에 대해 반환 할 스텁을 아직 설정하지 않은 것을 알 수 있습니다. 즉, 위의 클라이언트는 구성된 스텁이없는 URL http : // localhost : 8080 / test / abc를 요청합니다. 이 경우 Wiremock 서버는 404 no content를 반환합니다.
# 4) 이제 Wiremock 서버 인스턴스에 대해 위의 URL에 대한 스텁을 설정하려면 아래와 같이 Wiremock의 스텁 정적 메서드를 호출해야합니다.
private void configureStubs() { configureFor('localhost', 8080); stubFor(get(urlEqualTo('/test/abc')) .willReturn(aResponse().withBody('Test success!'))); }
여기에서 configureFor, stubFor 등과 같은 몇 가지 정적 메서드를 사용했음을 알 수 있습니다. 이러한 모든 메서드는 Wiremock Java 라이브러리의 일부입니다. (다음 튜토리얼 / 섹션에서 이러한 방법에 대해 자세히 살펴 보겠습니다)
# 5) 이제 구성 단계가 완료되면 클라이언트를 통해 요청을 실행하고 응답을 검증 할 수 있습니다 (스텁이 Wiremock을 통해 반환하도록 구성된 항목에 따라 다름).
요약하면 다음은 전체 코드 샘플의 모습입니다.
public class WiremockJunitTest { @Rule public WireMockRule wm = new WireMockRule(wireMockConfig().port(8080)); @Test public void assertWiremockSetup() throws IOException { // Arrange - setup wiremock stubs configureStubs(); // execute request through the http client OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url('http://localhost:8080/test/abc') .get() .build(); // Act - call the endpoint Response response = client.newCall(request).execute(); // Assert - verify the response assertEquals('Test success!', response.body().string()); verify(exactly(1),getRequestedFor(urlEqualTo('/test/abc'))); } // configure stubs for wiremock private void configureStubs() { configureFor('localhost', 8080); stubFor(get(urlEqualTo('/test/abc')) .willReturn(aResponse().withBody('Test success!'))); } }
필요한 종속성
다음과 같이 사용할 수 있습니다.
- Wiremock 종속성 만 포함하는 독립형 JAR.
- Wiremock 및 모든 종속성을 포함하는 뚱뚱한 항아리.
두 버전 모두 Gradle 및 Maven 종속성으로 사용할 수 있습니다. 자세한 내용은 공식 Maven 저장소에서 확인할 수 있습니다. 여기
비디오 튜토리얼 : Wiremock with JUnit Test
결론
이 자습서에서는 Wiremock의 기본 기능을 살펴보고 JUnit 규칙을 사용하여 독립형 서버 및 JUnit 테스트의 일부로 실행되는 방법을 살펴 보았습니다.
또한 스터 빙에 대해 간략하게 다루었으며 다음 자습서에서 자세히 다룰 것입니다.
NEXT 튜토리얼