안녕하세요!
이전글에서 코드만 많고 지루한 내용을 많이 해서 이번 글은 조금 가볍게 볼만한 내용을 준비했습니다.
백엔드를 통해 기능을 개발하다보면 이게 정말 내가 원하는대로 작동이 잘 될까? 하는 의심이 생길때가 자주 있죠. 그렇다고 이걸 잘 되길 기도하면서 적용이 될때동안 기다릴 수는 없는 노릇이고, 그리고 이전글처럼 따로 main함수를 만들어 돌려보고 하기도 복잡하고 지저분해지기만 합니다.
JUnit은 이런 의심들을 확신으로 바꿔주기 위해 생겨났습니다. 바로 내가 만든 기능들을 테스트하게 해주는 녀석입니다!
그렇다고 뭘 깔아야하나 한다면 그렇지 않습니다! 우리가 만든 프로젝트에서 바로 사용 가능합니다. 어디에서?? 바로 관찰력 좋으신분이라면 봐보셨을수도 있었던 test라는 곳에서 할 수 있습니다.
src에는 main과 함꼐 test도 있습니다. 그럼 바로 한번 해보도록 하겠습니다!!
기존글을 읽지 않으신 분들이라면??
JUnit에 대해서만 알고 싶으신 분들도 있겠죠? 그럼 아마 현재 글에서 예제로 다루는 프로젝트가 없으실겁니다.
해당 예제프로젝트를 다운로드하는 git clone을 통해 다운로드해주시고 코드들 간단하게 읽어주신 다음 따라와주세요!
test에 대해 알아보자
일단 이전에 Order에 대해 테스트해보려 작성했던 OrderApp 클래스는 삭제해주셔도 됩니다.
test폴더에 뭐가 있는지 봐봅시다!
main의 구조와 비슷합니다 main패키지의 구조와 비슷하죠? 저희가 만든 com.naver.shopping 패키지도 있네요!
test또한 main과 비슷하게 패키지도 만들고 그 안에 코드도 작성해 넣을 수 있고 그렇습니다. 차이가 있다면 해당 코드들이 테스트를 위한 코드들이라는거?
우리는 현재 Member와 Order에 엔티티를 만들고 기능들을 만들었으니까 얘네들을 테스트해보도록 하겠습니다.
shopping 안에 member와 order 패키지를 만들어주세요!
이제 패키지 만드는법은 잘 아시겠죠?
요렇게 만들어주세요
좋아요 이제 member의 기능들에 대해 테스트해봅시다.
회원기능 테스트
member 패키지 안에 MemberServiceTest라는 파일을 만들어봅시다.
회원가입을 하는 함수를 한번 사용해볼까요?
VIP등급인 실험체1을 ID값 1로 해서 회원가입을 시키는 함수를 만들었습니다. 이 코드에선 member와 ID값이 1인 member를 찾은 findMember가 같은 값이 되면 테스트가 성공할 것 같네요.
먼저 회원가입()이란 함수가 Test를 위해 작동하는 함수라는 것을 명시해보겠습니다. 바로 어노테이션으로요!
@Test 추가
@Test가 함수 위에 추가되면서 이 함수는 테스트를 위한 함수라는것을 명시하게 되었습니다.
이제 하나 더! member와 findMember가 같은 값인지 테스트하는 코드를 추가하겠습니다.
Assert 추가
그럼 아래에서 조금 더 풀어서 작성해보겠습니다.
@Test
어노테이션에 대해 자세히 설명드리게되면 이 글이 너무 길어질 것 같아서 간단하게 설명드리자면 “@Test”라는게 써져있는 줄 바로 아래에 있는 함수는 테스트를 위한 함수라는것을 나타내게 될 수 있어요!
이렇게 되면 해당 함수만 개별로 실행할 수 있게 되고, 각각의 테스트함수들마다 성공여부를 확인하게 될 수 있답니다.
어… 일단은 이거만 아시면 돼서 끝이예요! ㅋㅋㅋㅋㅋㅋㅋㅋ
Assertions
이건 바로 테스트함수 안에서 이 테스트의 조건을 걸어서 과연 내가 만든 함수가 내 뜻대로 적용할 지 확인하는 친구입니다!
assertThat()
얘는 비교 대상을 정하는 애입니다. 우리가 Member에 대한 테스트를 진행할 때 알고싶었던건 우리가 엔티티로 만든 member와 회원가입을 시켜서 ID값을 통해 가져온 findMember과 과연 정말 같은애일지였죠? 그래서 일단 member를 비교대상으로 올린겁니다. 그래서 Assertions.assertThat(member)가 된거죠
isEqualTo()
얘는 assertThat()에 올린 자식이랑 얘의 인자값이 과연 같을지 확인해주는 함수입니다. 그래서 Assertions.assertThat(member).isEqualTo(findMember)가 된 것이죠. 자연스럽게 번역해서 얘가(member)얘랑 같음?(findMember)로 보시면 될거같아요~~
Assertions의 함수들
테스트라는게 당연히 같은 경우만 테스트하진 않겠죠? assertThat()뒤에 .을 찍으면 사용할 수 있는 함수들이 쭈루룩 나타납니다. 각 함수들이 뭘 하는지는 isEqualTo()처럼 이름만보고도 유추하기 쉽게 되어있어요. 한번 목록들을 쭉 보면서 구경해보시는게 좋을거예요~
테스트 결과 보기
좋아요 이제 테스트 작성은 다 했어요. 근데 잘 되는지 어떻게 확인할까요?? 콘솔창??
테스트는 조금 다릅니다.
일단은 한번 실행시켜볼까요?
(오늘의 팁! MemberServiceTest에 마우스 커서를 두고 Ctrl+Shift_F10을 누르면 바로 실행됩니다!!)
결과화면
(초록 체크!!!!)
결과화면을 보시면 간단합니다. 우리가 만든 회원가입 함수명 옆에 초록색 체크가 떴다?? 그럼 오케이~~ 잘 되네!라는 뜻입니다. 우리가 Assertions의 함수들을 쓰면서 만든 조건들이 다 true로 통과했다는 뜻 입니다.
그러면 테스트가 실패하는 경우도 한번 만들어볼까요?
딱 봐도 실패할 테스트죠? 위 함수도 회원가입 함수 밑에 추가해서 다시 MemberServiceTest()를 돌려보죠.
결과화면
(빠빠 빨간맛~)
회원가입은 그대로 성공적으로 돌아갔고, 멍청한테스트는 초록 체크를 받지 못했네요! 거기다 왼쪽 멍청한 테스트쪽을 클릭하면 기대한 값과 실제 값을 보여주며 차이점을 확인할 수도 있어요!
테스트 함수들의 실행 순서
위 결과화면을 보면 조금 의아한 부분이 있어요. 바로 회원가입 함수보다 멍청한테스트가 먼저 실행이 된 것입니다. 저는 분명 회원가입 함수를 멍청한테스트 밑에 작성했거든요… 왜일까요?
바로 테스트 함수들은 작성 순서에 상관없이 실행이 됩니다. 그래서 어쩔땐 회원가입이 먼저 실행될 수도 있고 어쩔땐 멍청한테스트가 먼저 실행될수도 있는것이죠.
그렇기 때문에 순서를 생각해서 위에 있는 테스트함수가 행동한 것에 영향을 받아 아래 테스트에서 사용하게 했다면, 예상치못한 테스트 결과가 나올 수가 있겠죠? 이 점을 염두해두셔야해요!
과제
오늘은 혼자 풀어보시면 좋을 것 같은 내용이 있어서 과제로 드리려고해요! 절때 이 내용까지 글에 쓰기 귀찮아서 그런게 아닙니다ㅎㅎ
바로바로 아직 만들지않은 Order기능에 대한 테스트를 직접 만들어보는것입니다!! 할만하죠? 그럼 아래 조건들을 따라 테스트해보는 코드를 작성해보세요!
테스트 조건
- 테스트 파일의 이름은 “OrderServiceTest”로 할게요~
- 테스트 함수의 이름은 “주문하기”로 해주시구요
- Member테스트 할 때 만들었던 것 같이 사용자는 ID값 1의 “실험체1”이란 이름의 VIP 사용자입니다
- 24,900원짜리 USB를 샀을 때 1,000원이 할인되는지 확인하는 코드를 짜주세요!!
해당 글에서 추가된 git commit 내용 그리고 과제 정답은 아래 링크에서 확인하실 수 있습니다.
https://github.com/KIMB0B/blog_spring/commit/d89ae42a4c89f74ff7271173647d472d397ce17f
이상 JUnit에 대한 설명 들어주신 여러분들 감사합니다!