예전부터 한글로 테스트코드를 작성하는 것에 대한 얘기를 많이 들었습니다.
사실 저는 한글로 코드를 짜는 것에 대해서 거부했었던 사람중에 하나입니다.
(심지어 주석마저도 영어로 쓰자…라는 주의였…)
그러다가 갑자기 뽐뿌가 와서 한글로 한 번 변환해 봤습니다. 생각보다 나쁘지 않다는 느낌이 들었습니다.
처음에는 조금 눈에 안 익기는 한데, 테스트코드의 유지보수 측면에서 보면 꽤 괜찮지 않나라는 생각도 듭니다.
# 1.
우선 제가 테스트를 만드는 방식을 한 번 공유합니다.
간혹 테스트케이스를 보면 이해가 어려울 때가 있는데,
이런 방식으로도 할 수 있다는 예제 정도로 봐주시면 감사하겠습니다.
보통의 테스트코드입니다.
given-when-then의 구조이긴 한데, 생각보다 스펙을 이해하기가 쉽지 않습니다.
(1분간 코드를 보면서 분석을 해보시면 더더욱 좋습니다^0^)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@Test public void getUsers() throws Exception { // Given List<User> fakeResult = new ArrayList<User>(); fakeResult.add(fakeUser1); fakeResult.add(fakeUser2); when(userDAO.selectUserList(anyObject())).thenReturn(fakeResult); when(userDAO.selectCountUserList(anyObject())).thenReturn(10000); // When Map<String, Object> resultMap = dut.getUsers(new Param()); // Then List<User> resultList = (List<User>)resultMap.get("resultList"); Assert.assertEquals(2, resultList.size()); Assert.assertEquals(fakeUser1, resultList.get(0)); Assert.assertEquals(fakeUser2, resultList.get(1)); } |
# 2.
그리고 제가 작성하는 형태입니다.
기본적으로 given-when-then 구조를 가지고 있는데, 각 조건 및 검증을 모두 private으로 나누었습니다.
private메소드를 굳이 보지 않아도 해당 테스트의 동작을 확인할 수 있도록 작성했습니다.
private으로 만들어 놓은 조건들을 조합하면 다른 케이스에 대한 테스트도 쉽게 만들 수 있습니다.
(branch coverage 향상)
(쓰던 코드를 긁어와서 foo처리만 해서… 위의 코드와는 스펙이 다릅니다)
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 |
@Test public void doWhenNotExistEvent() { givenNotExistEvent(); dut.send(); verifyNeverDuplicateCheck(); verifyNeverPutInfo(); verifyNeverGetInfo(); verifyNeverSendMail(); } private void givenNotExistEvent() { givenEvent(null); } private void verifyNeverDuplicateCheck() { verify(fooBO, never()).isExistId(any(Params.class)); } private void verifyNeverPutCouponUseInfo() { verify(fooBO, never()).putInfo(any(Params.class)); } private void verifyNeverGetInfo() { verify(fooBO, never()).get(any(Params.class)); } private void verifyNeverSendMail() { verify(fooBO, never()).sendMail(any(Params.class)); } |
# 3.
위의 코드의 메소드명을 한글로 변환해봤습니다.
조금 부족하겠지만, 테스트코드를 스펙문서처럼 확인할 수 있다는 장점도 있습니다.
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 |
@Test public void 이벤트가없을때() { given_이벤트가없음(); dut.send(); verify_중복체크를하지않음(); verify_정보를입력하지않음(); verify_정보를조회하지않음(); verify_메일발송하지않음(); } private void given_이벤트가없음() { givenEvent(null); } private void verify_중복체크를하지않음() { verify(fooBO, never()).isExistId(any(Params.class)); } private void verify_정보를입력하지않음() { verify(fooBO, never()).putInfo(any(Params.class)); } private void verify_정보를조회하지않음() { verify(fooBO, never()).get(any(Params.class)); } private void verify_메일발송하지않음() { verify(fooBO, never()).sendMail(any(Params.class)); } |