22-09-24 테스트코드 작성해보기

BRINCE·2022년 9월 24일
0

스프링 스터디

목록 보기
1/10

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글자 리턴값 주는걸로 오버라이딩 해서 각각 테스트 케이스 생성 →
  • 각 상황에 테스트가 성공하고 실패하는지 확실하게 확인이 가능했다. →
  • 그리고 그 상황에 랜덤 패스워드 제너레이터는 필요없어졌으니 임포트를 하지 않아도 되기 때문에 낮은 결합도로 코드 작성이 가능해졌다. →
  • 인터페이스로 구현했기 때문에 편하게 람다식으로 작성이 가능하다.
profile
자스코드훔쳐보는변태

0개의 댓글