GivenWhenThen

Given When Then

Dan North 와 Chris Matts가 Behavior-Driven Development (BDD)의 일환으로 개발 한 접근 방식입니다 .

필수 아이디어는 세 가지 섹션으로 시나리오 (또는 테스트)를 작성하는 것입니다.

1
2
3
4
5
6
7
8
9
10
11
Given-When-Then 공식은 User Story에 대한 수락 테스트 의 작성을 안내하기위한 템플릿입니다 .

(Given) 약간의 문맥
(When) 어떤 행동이 수행된다.
(Then) 관찰 가능한 결과의 특정 세트가 얻어야한다.

예 :
(Given) 내 은행 계좌에 크레딧이 있고 최근에 인출을하지 않았다면,
(When) 카드의 한도액보다 적은 금액을 인출하려고하면,
(Then) 그런 다음 철회가 오류나 경고없이 완료되어야합니다.

코드로 풀어보면 아래처럼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

package com.github.sejoung.repositories;


import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.is;


import com.github.sejoung.domain.DomainTest;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@DataJpaTest // the test slice
@Slf4j
public class TestRepositoryDomainDomainTest {

@Resource
private DomainTestRepository repository;

@Resource
private TestEntityManager testEntityManager;

@Test
public void 조회테스트() {

// given
var dt = DomainTest.builder().title("test").build();
testEntityManager.persistAndFlush(dt);

//when
var saveDt = repository.findById(dt.getId()).orElseThrow();

//then
assertThat(saveDt.getTitle()).as("타이틀이 저장된 값과 조회된 값이 같아야 된다.").isEqualTo("test");
assertThat(saveDt.getId()).as("id가 있어야 된다.").isNotNull();
assertThat(saveDt.getCreateDateTime().toLocalDate()).as("저장된 생성일자와 조회된 생성일자가 같아야 된다.")
.isEqualTo(dt.getCreateDateTime().toLocalDate());

Assert.assertThat("타이틀이 저장된 값과 조회된 값이 같아야 된다.",saveDt.getTitle(), is("test"));
}

}

위에 코드를 보면 hamcrest와 assertj를 썩어 써보았다.

제쪽엔 더 장점을 느끼는게 assertj가 코드 어시스턴트의 도움을 받을수 있어서 더 편한것 같다.

참조