개발한 기능을 이제 테스트를 해야 한다.
지금까지 main 메서드를 이용했고 그 외에는 웹 애플리케이션의 컨트롤러를 통해 실행을 할 수도 있다.
하지만 이런 방법은 실행에 오래 걸리고 반복 실행도 어려운 등 단점이 크다.
그래서 자바 Junit 이라는 프레임 워크로 테스트를 실행해서 위같은 문제를 해결할 수 있다,
회원 리포지토리 메모리 구현체 테스트
위의 사진처럼 test 폴더의 가장 마지막에 repository 패키지를 만들어 주고 이후 새롭게 자바 파일을 만들어 준다.
위처럼 진행해 주고 실행을 해보면 아래의 결과를 얻을 수 있다.
위 처럼 만약 값이 일치하고 존재한다면 출력되는 것은 없지만 녹색으로 성공한 것을 볼 수 있다.
만약 null
이여서 실패가 뜨면 Expected
에는 기대했던 값 현재의 값 Actual
이라고 뜨면서 에러가 발생한다.
위에서 사용한 Assertions
함수에는 두가지 종류가 있는데 처음에 사용한 것은 junit
으로 테스트를 해 보았다.
다만 이제부터는 assertj
의 것으로 진행을 할것이다.(왜냐면 강사님이 이게 쓰기가 더 편하다고 하셨으니까...?)
위의 모양이 되는데 가독성에 있어서 더 보기가 편한 것을 볼 수 있다.
그리고 저기서 더욱 간결하게 사용할 수도 있는데 Alt + Enter
를 해서 static
을 추가해 주면...
시작점에 위 같이 새롭게 import
된 것을 볼 수 있다.
저렇게 해주면 이제 코드를 쓸 때 앞에다가 Assertions
조차도 붙이지 않고 아래와 같이 사용이 가능하다.
위 같은 형태만으로도 사용이 가능해진다.
이번에는 이름을 찾는 기능을 테스트 해보자.
위처럼 입력하고 실행해 보면은
잘 작동한 것을 볼 수 있다.
위처럼 찾는 값은 spring2
인데 검증에서는 member1
즉, spring1
이여서 일치하지 않으면
위처럼 에러를 띄우는 것을 볼 수 있다.
그리고 클래스 단에서 한번에 돌릴 수도 있는데 이렇게 하면 아래의 Test
메소드가 전부 실행되서 아래와 같은 결과를 볼 수 있다.
결과에서 Test
메서드 2개가 모두 돌아간 것을 볼 수 있다.
이번에는 모든 값을 다 찾아 보자
내가 입력한 것은 2개 밖에 없는데 3개를 찾을 경우 저렇게 에러를 띄운다.
isEqualsTo
의 뒤에 오는 값을 이렇게 쓰일수도 있다는 것 정도로 알고 넘어가자.
이번에는 원래 값에 맞게 2
로 변경해주고 전체를 돌려보자 그러면...
이전에는 잘 돌았었는데 갑자기 findByName()
에서 에러가 발생했다.
옆의 순서를 잘 보면 findAll()
이 제일 먼저 시작한 것을 볼 수 있다.
즉, 순서의 경우에는 프로그램에서 알아서 잡아 준다고 보면 된다.
그렇기 때문에 순서에 의존적으로 해서 설계를 하면 안된다.
위 순서를 보면 findAll()
에서 이미 객체를 저장을 했다.
spring1
과 spring2
이 여기서 저장이 되었는데
findByName()
에서 있는데 또 저장을 하려고 했기 때문에 에러가 발생한 것이다.
그래서 이 같은 현상을 방지하기 위해서는 한번 깔끔하게 클리어를 해 줘야 한다.
즉, 테스트가 끝날 때 마다 repository
를 지워주는 코드를 넣어줘야 한다.
Test
자바 파일에서 상단부에 아래와 같은 코드를 만들어 준다.
MemoryMemberRepository
레포지토리 맨 아래에는 아래의 메소드를 만들어 준다.
이제 실행하면 정상적으로 잘 되는것을 볼 수 있다.
지금은 개발을 끝내고 난 후에 테스트를 만들어서 진행하게 되었지만 이를 오히려 미리 테스트 케이스를 만들고 개발을 하는경우가 있는데 이를 TDD
테스트 주도적 개발 이라고 한다.
실제 개발 환경에서는 이러한 방식으로 많이 하는 듯 하다...