[TIL] Java 테스트 코드 작성법

8850 단어 JavaTILJava

테스트 코드를 왜 작성해야 할까 🤔

테스트 코드를 작성하는 이유는 잘 작동하는, 깔끔한 코드를 얻기 위함이다.
테스트를 쉽게 하기 위해서는 어플리케이션 코드를 테스트하기 쉽게 짜야하는데,
테스트하기 쉽게 코드를 짜려고 노력하다보면 결국 어플리케이션 코드가 깔끔해진다!


TDD 👀❓

TDD란 Test Driven Development의 약자로 테스트 주도 개발이라고 한다.

메소드나 함수같은 프로그램 모듈을 작성할 때 작성 종료조건을 먼저 정해놓고 코딩을 시작한다는 의미로 받아들이면 편하다.

  • RED : 항상 실패하는 테스트를 먼저 작성
  • GREEN : 테스트에 통과하는 프로덕션 코드 작성
  • REFACTOR : 테스트가 통과하면 프로덕션 코드를 리팩토링

위의 레드 그린 사이클 처럼 우선 테스트를 작성하고 그걸 통과하는 코드를 만들고 해당 과정을 반복하면서
제대로 동작하는지에 대한 피드백을 적극적으로 받는 것이다.


✔️ TDD를 사용했을 때의 장점

  • 개발 초기 단계에 문제를 발견할 수 있다.
  • 추후에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존기능이 올바르게 작동하는지 확인할 수 있다.
  • 기능에 대한 불확실성을 감소시켜준다.
  • 단위 테스트 자체가 문서로 사용할 수 있다.

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;
}

➡️ nameamount 를 멤버변수로 가지는 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 라는 클래스를 만들었다.

  1. @Test
    @Test 어노테이션이 붙은 메서드가 테스트를 수행하는 메서드가 된다는 의미이다.

  2. assertThat
    assertJ 라는 테스트 검증 라이브러리의 검증 메소드이다.
    HelloResponsedtoname과 테스트하는 메소드에 있는 name 이 같은지 확인한다.

예제 참고 자료

좋은 웹페이지 즐겨찾기