서론
Junit이 무엇인가?
- Unit test를 하기 위한 framework 기능을 하는 라이브러리.
왜 Junit을 써야하는가? 쓰면 좋은가?
장점.
- 자동화된 테스트를 만들수 있다.
- 더욱 손쉽게 리팩토링 할수 있다(테스트 코드를 믿고, 검증을 다 통과하는 식으로)
- 장기적 유지보수 관점으로 보면 안썼을떄 보다 시간을 단축시킨다.
단점.
- 초기에 공수가 더든다.(테스트도 작성 & 실제 기능도 작성.)
- 기능이 바뀌면 테스트코드도 수정해야한다(손이 더감.)
본론
2장 Junit 써보기
테스트 대상의 이해
package iloveyouboss;
import java.util.*;
public class Profile {
private Map<String,Answer> answers = new HashMap<>();
private int score;
private String name;
public Profile(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void add(Answer answer) {
answers.put(answer.getQuestionText(), answer);
}
public boolean matches(Criteria criteria) {
score = 0;
boolean kill = false;
boolean anyMatches = false;
for (Criterion criterion: criteria) {
Answer answer = answers.get(
criterion.getAnswer().getQuestionText());
boolean match =
criterion.getWeight() == Weight.DontCare ||
answer.match(criterion.getAnswer());
if (!match && criterion.getWeight() == Weight.MustMatch) {
kill = true;
}
if (match) {
score += criterion.getWeight().getValue();
}
anyMatches |= match;
}
if (kill)
return false;
return anyMatches;
}
public int score() {
return score;
}
}
테스트 만들기.
리펙토링을 해봅시다!
package iloveyouboss;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
public class ProfileTest2 {
Question question;
Profile profile;
Criteria criteria;
@Before
public void initialize() {
question = new BooleanQuestion(0, "get more than 20 annual leave?");
profile = new Profile("dongseok Inc.");
criteria = new Criteria();
}
@Test
public void didmustmatchworkwell() {
profile.add(new Answer(question, Bool.FALSE));
criteria.add(new Criterion(new Answer(question, Bool.TRUE), Weight.MustMatch));
boolean matches = profile.matches(criteria);
assertFalse(matches);
}
@Test
public void diddontcareworkwell() {
profile.add(new Answer(question, Bool.FALSE));
criteria.add(new Criterion(new Answer(question, Bool.TRUE), Weight.DontCare));
boolean matches = profile.matches(criteria);
assertTrue(matches);
}
}
3장 Junit 단언 깊게 파기
Junit 단언의 방법
package iloveyouboss;
import static org.junit.Assert.*;
import org.junit.Ignore;
import static org.hamcrest.CoreMatchers.*;
import org.junit.Test;
public class AssertTest {
@Test
public void assertTrueTest() {
boolean b1 = true;
assertTrue(b1);
}
@SuppressWarnings("deprecation")
@Ignore
@Test
public void assertThatTest() {
assertThat(1,equalTo(2));
}
@Test
public void startwithTest() {
assertThat("asdf", not(startsWith("aswd")));
}
}
Junit 예외기대하는 3가지 방법.
결론
- 공통된 환경 설정을 위해선 @Before 어노테이션을 쓰면 된다.
- 단언에는 여러가지 방법이 있다.
- 예외를 처리하는 방법도 여러가지가 있다.
- 테스트코드도 리펙토링이 필요하다.