토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.


이번 섹션에선 스프링을 사용하지 않는 애플리케이션에서, 아티팩토리에 업로드된 스텁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을 사용하는 예시다:

JUnit 4 Rule JUnit 5 Extension
@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를 사용하지 않기 때문에, testModeEXPLICIT으로 변경해서 특정 포트에 바인딩된 애플리케이션에 실제 요청을 전송하면 된다.

이번 예제에선 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 모드(즉, 실제 포트로 요청을 전송하도록)로 설정해주면 된다:

Maven Gradle
<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);
	}
}

여기서는 다음과 같은 것들을 설정해보았다:


Next :
2.7. Provider Contract Testing with Stubs in Artifactory in a Non-JVM World
JVM이 아닌 애플리케이션에서 아티팩토리에 업로드한 스텁 사용하기

전체 목차는 여기에 있습니다.

<< >>

TOP