공식 레퍼런스를 한글로 번역한 문서입니다.
전체 목차는 여기에 있습니다.
이번 섹션에선 스프링을 사용하지 않는 애플리케이션에서, 아티팩토리에 업로드된 스텁stub을 사용해 서비스 제공자 주도로 명세를 테스트Provider Contract Testing하는 방법을 알아본다.
목차
2.6.1. The Flow
Nexus나 Artifactory에 있는 스텁stub을 사용한 서비스 제공자 주도 명세 테스트Provider Contract Testing 과정은 처음 만드는 Spring Cloud Contract 애플리케이션에서 확인할 수 있다.
2.6.2. Setting up the Consumer
컨슈머consumer 측에서는 JUnit rule을 사용할 수 있다. 그러면 스프링 컨텍스트를 시작하지 않아도 된다. 다음은 (JUnit4, JUnit 5에서) rule을 사용하는 예시다:
@Rule
public StubRunnerRule rule = new StubRunnerRule()
.downloadStub("com.example","artifact-id", "0.0.1")
.repoRoot("git://git@github.com:spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git")
.stubsMode(StubRunnerProperties.StubsMode.REMOTE);
@RegisterExtension
public StubRunnerExtension stubRunnerExtension = new StubRunnerExtension()
.downloadStub("com.example","artifact-id", "0.0.1")
.repoRoot("git://git@github.com:spring-cloud-samples/spring-cloud-contract-nodejs-contracts-git.git")
.stubsMode(StubRunnerProperties.StubsMode.REMOTE);
2.6.3. Setting up the Producer
기본적으로 Spring Cloud Contract 플러그인은 Rest Assured의 MockMvc
설정을 통해 테스트를 자동 생성한다. 스프링이 아닌 애플리케이션은 MockMvc
를 사용하지 않기 때문에, testMode
를 EXPLICIT
으로 변경해서 특정 포트에 바인딩된 애플리케이션에 실제 요청을 전송하면 된다.
이번 예제에선 Javalin이라는 프레임워크를 사용해 스프링을 사용하지 않는 HTTP 서버를 시작한다.
다음과 같은 애플리케이션이 있다고 가정해보자:
import io.javalin.Javalin;
public class DemoApplication {
public static void main(String[] args) {
new DemoApplication().run(7000);
}
public Javalin start(int port) {
return Javalin.create().start(port);
}
public Javalin registerGet(Javalin app) {
return app.get("/", ctx -> ctx.result("Hello World"));
}
public Javalin run(int port) {
return registerGet(start(port));
}
}
애플리케이션이 준비됐다면, 다음과 같이 플러그인을 EXPLICIT
모드(즉, 실제 포트로 요청을 전송하도록)로 설정해주면 된다:
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<version>${spring-cloud-contract.version}</version>
<extensions>true</extensions>
<configuration>
<baseClassForTests>com.example.demo.BaseClass</baseClassForTests>
<!-- This will setup the EXPLICIT mode for the tests -->
<testMode>EXPLICIT</testMode>
</configuration>
</plugin>
contracts {
// This will setup the EXPLICIT mode for the tests
testMode = "EXPLICIT"
baseClassForTests = "com.example.demo.BaseClass"
}
BaseClass
는 대략 다음과 같이 작성한다:
import io.javalin.Javalin;
import io.restassured.RestAssured;
import org.junit.After;
import org.junit.Before;
import org.springframework.cloud.test.TestSocketUtils;
public class BaseClass {
Javalin app;
@Before
public void setup() {
// pick a random port
int port = TestSocketUtils.findAvailableTcpPort();
// start the application at a random port
this.app = start(port);
// tell Rest Assured where the started application is
RestAssured.baseURI = "http://localhost:" + port;
}
@After
public void close() {
// stop the server after each test
this.app.stop();
}
private Javalin start(int port) {
// reuse the production logic to start a server
return new DemoApplication().run(port);
}
}
여기서는 다음과 같은 것들을 설정해보았다:
- 요청을 모킹하는 대신 실제로 요청을 전송하도록 Spring Cloud Contract 플러그인에
EXPLICIT
모드를 설정했다. BaseClass
에는 다음과 같은 로직을 추가했다:- 각 테스트를 실행할 때마다 임의의 포트에서 HTTP 서버를 시작한다.
- 해당 포트로 요청을 전송하도록 Rest Assured를 세팅한다.
- 각 테스트가 끝나면 HTTP 서버를 종료한다.
Next :
2.7. Provider Contract Testing with Stubs in Artifactory in a Non-JVM World
JVM이 아닌 애플리케이션에서 아티팩토리에 업로드한 스텁 사용하기
전체 목차는 여기에 있습니다.