[TIL] Java 테스트 코드 작성법
테스트 코드를 왜 작성해야 할까 🤔
테스트 코드를 작성하는 이유는 잘 작동하는, 깔끔한 코드를 얻기 위함이다.
테스트를 쉽게 하기 위해서는 어플리케이션 코드를 테스트하기 쉽게 짜야하는데,
테스트하기 쉽게 코드를 짜려고 노력하다보면 결국 어플리케이션 코드가 깔끔해진다!
TDD 👀❓
TDD란 Test Driven Development의 약자로 테스트 주도 개발이라고 한다.
메소드나 함수같은 프로그램 모듈을 작성할 때 작성 종료조건을 먼저 정해놓고 코딩을 시작한다는 의미로 받아들이면 편하다.
RED
: 항상 실패하는 테스트를 먼저 작성GREEN
: 테스트에 통과하는 프로덕션 코드 작성REFACTOR
: 테스트가 통과하면 프로덕션 코드를 리팩토링
위의 레드 그린 사이클 처럼 우선 테스트를 작성하고 그걸 통과하는 코드를 만들고 해당 과정을 반복하면서
제대로 동작하는지에 대한 피드백을 적극적으로 받는 것이다.
✔️ TDD를 사용했을 때의 장점
- 개발 초기 단계에 문제를 발견할 수 있다.
- 추후에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존기능이 올바르게 작동하는지 확인할 수 있다.
- 기능에 대한 불확실성을 감소시켜준다.
- 단위 테스트 자체가 문서로 사용할 수 있다.
✔️ 좋고 깨끗한 테스트 코드를 위한 FIRST 규칙
Fast
: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.Independent
: 각각의 테스트는 독립적이며 서로 의존해서는 안된다.Repeatable
: 어느 환경에서도 반복 가능해야 한다.Self-Validating
: 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.Timely
: 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.
Given / When / Then 👀❓
모든 테스트 문장은 Given/When/Then
으로 나눠서 작성할 수 있어야 한다.
public class WhatIsGWT {
@Test
public void gwt_test() {
// given
// 테스트를 준비하는 과정
// 테스트에 사용하는 변수, 입력 값 등을 정의하거나, 객체를 정의하는 구문도 Given에 포함된다.
// when
// 실제로 테스트를 실행하는 과정
// then
// 테스트를 검증하는 과정
}
}
Given
- 테스트를 위해 주어진 상태
- 테스트 대상에게 주어진 조건
- 테스트가 동작하기 위해 주어진 환경
When
- 테스트 대상에게 가해진 어떠한 상태
- 테스트 대상에게 주어진 어떠한 조건
- 테스트 대상의 상태를 변경시키기 위한 환경
Then
- 앞선 과정의 결과
➡️ 어떤 상태에서 출발(given
) 하여 어떤 상태의 변화를 가했을 때(when
) 기대하는 어떠한 상태가 되어야 한다.(then
)
간단한 예제 👩🏻💻
자바에는 테스트 코드 작성을 도와주는 JUnit
이라는 프레임워크가 있다.
예제에서는 JUnit4
를 사용했다.
package com.example.demo.web.dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
private final String name;
private final int amount;
}
➡️ name
과 amount
를 멤버변수로 가지는 HelloResponseDto
클래스 생성
package com.example.demo.web.dto;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
public class HelloResponseDtoTest {
@Test
public void 롬복_기능_테스트() {
//given
String name ="test";
int amount =1000;
//when
HelloResponseDto dto =new HelloResponseDto(name, amount);
//then
assertThat(dto.getName()).isEqualTo(name);
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
➡️ HelloResponseDto
라는 클래스에 lombok이 잘 적용되었는지 테스트 하기 위해 HelloResponseDtoTest
라는 클래스를 만들었다.
-
@Test
@Test
어노테이션이 붙은 메서드가 테스트를 수행하는 메서드가 된다는 의미이다. -
assertThat
assertJ
라는 테스트 검증 라이브러리의 검증 메소드이다.
HelloResponsedto
의name
과 테스트하는 메소드에 있는name
이 같은지 확인한다.
Author And Source
이 문제에 관하여([TIL] Java 테스트 코드 작성법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sorzzzzy/TIL-Java-테스트-코드-작성법저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)