2장. JUnit 진짜로 써 보기.
이 장에서는 코드를 분석해서 코드의 한 가지 경로를 커버하는 테스트를 작성해볼거고,
코드를 따라 두 번째 경로를 검증하는 두 번째 테스트를 작성해볼거고,
테스트 구조도 살펴보고 공통으로 사용되는 초기화 코드를 한 곳에 모을 수 있는 @Before annotation에 대해서도 알아보도록 한다.
구인자와 구직자는 둘 다 다수의 객관식 혹은 yes-no 질문에 대답을 하는 프로파일을 생성한다.
웹사이트는 다른 측 기준에 맞는 프로파일로 점수를 매기고 고용주와 고용자 모두의 관점에서 최상의 매치를 보여준다.
Profile 클래스를 먼저 작성해보자.
코드설명먼저 하자면 Profile 클래스는 어떤 사람이 회사 혹은 구직자에게 물어볼 수 있는 적절한 질문에 대한 답변을 담고 있다.
add() 메서드를 호출하여 Answer객체를 Profile 클래스에 추가할 수 있고,
Question 객체는 질문 내용과 답변이 가능한 범위를 포함하면서 대응하는 Question 객체를 참조하고 그 대답에 대한 값을 포함한다.
Criteria 인스턴스는 Criterion 객체를 담는 컨테이너이며,
Criterion 객체는 고용주가 구직자를 찾거나 그 반대를 의미한다.
matches() 메서드는 Criteria 객체를 인자로 받아서 각 Criterion에 대한 반복문을 실행해서,
해당 기준이 프로파일에 있는 답변과 맞는지 결정하는데 기준이 절대적이지만 답변과 맞지 않는다면 혹은 맞는 기준이 없다면 false 반환.
테스트 코드 작성 시 요령? 주의사항? 중 하나는
코드의 가장 위험한 영역이 어디인지 대략은 알고 있어야 한다는 것이다.
matches() 메서드에서는 for 반복문 안에 있다고 한다. 음...그른가.......
일단 반복문을 따라 한 가지 경로를 커버하는 단순 테스트를 작성해보자.
Profile을 생성하고 질문을 만들고 Criterion 객체를 만들어 답변과 그 가중치를 저장한다.
반대로 criteriaAnswer 변수는 같은 질문과 기대하는 정답을 포함한다. 마지막으로 criteria에 객체 추가.
matches() 메서드에서 for 반복문을 돌면서 answer 해시맵에서 Answer 객체를 가져오기 때문에,
사전에 Profile 객체에 적절한 Answer 객체를 먼저 놓아야 한다. 아래 코드를 Criteria 객체 생성 전에 추가해주자.
이제 작성한 테스트 코드 함수명도 테스트 내용을 알아볼 수 있게 수정하고 실행과 단언 단계 코드도 추가해주자.
그러면 matches() 메서드에 대한 지식을 바탕으로 의도하는 대로 동작하는지 검증하는 하나의 테스트 코드 작성 끝.
이제 두 번째 테스트 코드를 작성해보자.
Profile 클래스에서 match 지역변수에 대한 할당을 보면 기준 가중치가 DontCare이면 match 변수는 true가 된다.
이 점을 기억하면서 첫 번째 테스트 코드와 유사하게 Profile 객체랑 등등 객체 생성.
두 테스트 코드에서 공통부분이 존재하는 것을 볼 수 있다. 리팩토링해보자!
중복 코드를 @Before 메서드로 이동시키고 가독성 좋게 바꾸면 아래와 같이 된다.
이 코드를 한번 더 다듬어보자.
지역 변수를 인라인하여 준비, 실행, 단언 부분을 한두줄로 압축해서 가독성을 높여보도록 할 것이다.
이렇게 2장에서는 Profile 클래스 코드를 작성하고,
그 안의 matches() 메서드에서 두 가지 단위 테스트 코드를 작성해보면서 단위 테스트 작성을 익혀보았다.
좋은 단위 테스트를 작성하는 것은 단지 assert만 넣어서는 되지는 않는다는 내용과 함께 2장 끝.
'BookReview' 카테고리의 다른 글
DOIT! 반응형 웹 만들기_부록 (0) | 2022.03.10 |
---|---|
DOIT! 반응형 웹 만들기_셋째마당 (0) | 2022.03.10 |
DOIT! 반응형 웹 만들기_둘째마당 (0) | 2022.03.08 |
DOIT! 반응형 웹 만들기_첫째마당 (0) | 2022.03.08 |
자바와 JUnit을 활용한 단위테스트_01 (0) | 2022.02.05 |