JUnit 5
자바 단위 테스팅 프레임워크
AssertJ
테스트코드 가독성을 높여주는 자바 라이브러리
테스트 코드를 작성하는 이유
문서화 역할
- 잘 작성된 테스트 코드는 문서화 역할을 할 수 있다. (어떤걸 요구하고 어떤 오류가 발생하였는지 확인이 편해진다.)
코드에 결함을 발견하기 위함
- 테스트 코드를 작성하면서 결함을 발견하기도 하다.
리팩토링 시 안정성 확보
- 테스트 코드를 작성하면 리팩토링할때 심리적 안정성을 확보할 수 있다 (나중에 설명)
테스트 하기 쉬운 코드를 작성하다 보면 더 낮은 결합도를 가진 설계를 얻을 수 있다.
TDD
- Test Driven Development (테스트 주도 개발)
- 프로덕션 코드보다 테스트 코드를 먼저 작성하는 개발 방법
- TFD(Test First Development) +리팩토링
- 기능 동작을 검증(메소드단위)
- 일단 테스트 코드를 작성해서 실패가 나오게 한다 →
- 실패가 나왔기 때문에 성공을 시키도록 코드를 작성 →
- 테스트 코드 완성 !
BDD
- Behavior Driven Development (행위 주도 개발)
- 시나리오 기반으로 테스트 코드를 작성하는 개발 방법
- 하나의 시나리오는 Given,When,Then 구조를 가짐
어노테이션
- DisplayName 어떠한걸 요구하는지 전달
- Test 테스트 메소드 생성
경계조건에 대해 테스트 코드를 작성해야 한다. 경계조건에서 테스트를 하지 않으면 문제가 많이 발생한다. 반드시 작성 필수
- ParameterrizedTest , ValueSource 경계값으로 테스트
코드 작성 실습
랜덤 비밀번호 생성기 // 비밀번호 검증 코드 작성했을때 :
메소드 자체를 만들어서 테스트 코드에 구현했을때, 완전한 테스트를 할 수 없을때
(비밀번호 생성기처럼 확실하게 비밀번호가 8자이상, 12자 이하여야 하지만 매번 같은 글자수가 나오지 않을때 확실한 테스트가 불가 / 의존성 높음)
클래스를 따로 생성해줌 → CurrentFixedPassword (매번 8자 이상 12자 이하의 패스워드만 생성)
→ WrongFixedPassword (매번 조건에 부합하지 않는 패스워드 생성)
여기에 인터페이스를 구현시켜 추상 메소드 선언 후에, 각 클래스에서 호출
- 랜덤패스워드 제너레이터 객체를 생성해 랜덤값을 리턴받을땐 실패가 발생
- 하지만 클래스를 따로 생성해 메소드를 호출했을때 각각 확실하게 테스트를 성공시킬 수 있다.
- 이 과정에서 리팩토링할때 오류가 안나는게 확실하기 때문에 심리적 안정을 얻을 수 있다.
- 이때 인터페이스를 사용하기 때문에 람다식을 활용해서 간단하게 리턴값을 얻을 수 있게 변경이 가능하다.
- 기존의 랜덤패스워드제너레이터 객체를 생성해서 값을 넣게 했을때보다 더 낮은 결합도를 가진다.
기타
- gradle은 의존성 주입으로 라이브러리를 활용 할 수 있다.
- assertThatCode 로 확실한 테스트를 하게 한다. (예외를 발생시키거나.. 등등)
코드 작성 순서
- passay 라이브러리 → 랜덤 패스워드 만들어줄때 활용
- 패스워드 발리데이터 테스트 코드 작성 →
- 테스트 성공하면 해당 클래스 작성 →
- 유저 클래스 작성 후에 패스워드 변수 선언 →
- 게터 생성 → 패스워드 초기화 메소드 선언 →
- 패스워드 테스트 코드 작성 →
- 처음엔 랜덤 제너레이터 메소드 리턴값으로 초기화를 했기 때문에 8자~12자가 아니면 예외 발생 →
- 따로 메소드를 하나 더 만들고 패스워드 제너레이터 인터페이스 생성 →
- Wrong/Correct Fixed password generator 클래스생성 후에 패스워드 제너레이터 인터페이스 구현 →
- 패스워드 초기화 메서드에 랜덤제너레이터 빼고 패스워드 제너레이터 구현 후에 추상 메소드에 각각의 8자 이상 12자 이하 리턴값 / 3글자 리턴값 주는걸로 오버라이딩 해서 각각 테스트 케이스 생성 →
- 각 상황에 테스트가 성공하고 실패하는지 확실하게 확인이 가능했다. →
- 그리고 그 상황에 랜덤 패스워드 제너레이터는 필요없어졌으니 임포트를 하지 않아도 되기 때문에 낮은 결합도로 코드 작성이 가능해졌다. →
- 인터페이스로 구현했기 때문에 편하게 람다식으로 작성이 가능하다.