반응형

Mockito 를 이용해서 TDD 환경을 잡아놓고,

Ecl Emma 를 설치하여 로직의 coverage를 맞추는 방식으로 개발을 진행하고 있었다.


그런데, remote환경에 RDB가 있다보니, 예상치 못한 버그들이 발생을 하여,

실제로 세팅된 remote환경에 있는 API를 검증해야되겠다고 생각을 하던중, JBeHave라는 BDD Framework를 발견하게 되었다.

(http://jbehave.org/)


BDD는 기본적으로 3단계를 가지게 된다.

Given : 실제 행동 전 준비단계

When : 행동

Then : 검증


본인의 경우 restful API서버에 대한 테스팅을 해야되기 때문에,

Given 단계에서 파라미터 세팅을 하고, When에서 remote API call, Then에서는 API에서 받은 결과값에 대한 검증을 하였다.


간단하게 세팅 방법을 정리해본다.

IntelliJ 에서는 JBehave 플러그인을 제공하기 때문에, 좀 더 편리하게 세팅을 할 수 있었다.

메이븐 의존성 주입을 해주고, 아래 단계에 맞게 세팅한다. (현재 최신 stable버전은 3.9.5)

<dependency>
<groupId>org.jbehave</groupId>
<artifactId>jbehave-core</artifactId>
<version>3.9.5</version>
</dependency>


1. story 파일을 만든다. 


2. Given, When, Then 시나리오를 작성한다.

ex)

Given I set parameter a is 1, b is 2, c is 3
When I do call home/index
Then I should get successful home/index response

3. story파일에 선언한대로 Annotation을 붙여서, java 코드로 구현한다. (story파일은 test/resources 경로에 두어야 runner가 잘 찾는 것 같다.)

@Given("I set parameter a is $a, b is $b, c is $c")
public void setHomeIndexParams(@Named("a") int a,
@Named("b") int b,
@Named("c") int c) {
}

@When("I do call $path")
public void reqApiCall(String path) throws IOException {

}
@Then("I should get successful home/index response")
public void resHomeIndex() {

}


4. Runner 작성

@RunWith(AnnotatedEmbedderRunner.class)
@Configure(storyLoader = JBehaveTestRunner.StoryLoader.class,
storyReporterBuilder = JBehaveTestRunner.ReportBuilder.class)
@UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = false,
ignoreFailureInView = true, verboseFailures = true)
@UsingSteps(instances = { NormalGameFlow.class }) // 3번에서 작성한 클래스명 넣어준다.
public class JBehaveTestRunner extends InjectableEmbedder {

@Test
public void run() {
List<String> storyPaths = new StoryFinder().findPaths(codeLocationFromClass(this.getClass()), "**/*.story", "");
injectedEmbedder().runStoriesAsPaths(storyPaths);
}

public static class StoryLoader extends LoadFromClasspath {

public StoryLoader() {
super(JBehaveTestRunner.class.getClassLoader());
}
}

public static class ReportBuilder extends StoryReporterBuilder {

public ReportBuilder() {
this.withFormats(org.jbehave.core.reporters.Format.CONSOLE,
org.jbehave.core.reporters.Format.HTML).withDefaultFormats();
}
}
}


5. JUnit으로 run 하면, 잘 돌아가는 것을 볼 수 있다.


이걸로, 기존에 지저분하게 시나리오 테스트 만들었던 것을, 깔끔하게 정리 완료!

반응형
,