프로그래밍/테스트 코드

JUnit 테스트 해보기 - 1 ( with Java 8+ )

duriepark09 2019. 8. 10. 02:55

자바와 JUnit을 활용한 실용주의 단위 테스트  도서 참고  http://www.yes24.com/Product/Goods/75189146?Acode=101  

 

자바와 JUnit을 활용한 실용주의 단위 테스트

『실용주의 프로그래머』의 앤디 헌트와 데이브 토마스가 알려주는실용주의 단위 테스트!클린 코드의 핵심인 단위 테스트, 어디서 어떻게 시작해야 할까? 책에서는 단위 테스트의 개념과 작성 이유부터 테스트 가이드라인, 목 객체 사용법, 자동화된 단위 테스트, 리팩토링까지 단위 테스트의 핵심 내용을 설명한다. 또한, 자바와 JUnit으로 단위...

www.yes24.com

* 컨셉: 일단 순서대로 따라하고 실행해보고, 마지막에 원리를 설명하는 형태로 정리하기

 

  1. 제목 : JUnit 테스트 해보기 - 1 ( with Java 8+ ) 
  2. 목적 : 테스트 코드를 작성해 품질높은 코드를 정확하게 작성하고, 야근을 줄여보자!
  3. 대상 : JUnit으로 테스트 해보지 않았던 분들 혹은 JUnit으로 테스트 해보고 싶은 분들(언어 : Java)
  4. 진행할 내용 
    • 동작하는 기본적인 프로그램 클래스를 구현한다.
    • 테스트 클래스를 만든다.
    • 테스트 클래스 안에 검증 메소드를 구현한다. 
    • JUnit 테스트 코드 실행하고 통과하기

 

(실제 구현) 

  • 동작하는 기본적인 프로그램 클래스를 구현한다.
    • java project 이름 : JavaTestPrj
    • src/com/javatest/exam01/Scoreable.java
    • src/com/javatest/exam01/ScoreCollection.java
package com.javatest.exam01;

@FunctionalInterface
public interface Scoreable {
	int getScore();
}


package com.javatest.exam01;

import java.util.ArrayList;

public class ScoreCollection {
	private ArrayList<Scoreable> scores = new ArrayList<Scoreable>();
	
	public void add(Scoreable scoreable) {
		scores.add(scoreable);
	}
	
	public int arithmeticMean() {
		int total = scores.stream().mapToInt(Scoreable::getScore).sum();
		return total / scores.size();
	}
}
  • 테스트 클래스를 만든다.
    • src/com/javatest/exam01/ScoreCollectionTest.java
  • 테스트 클래스 안에 검증 메소드를 구현한다.
    • public void answerArithmeticMeanOfTwoNumbers()
  • JUnit 테스트 코드 실행하고 통과하기
    • assertThat()
package com.javatest.exam01;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;

import org.junit.jupiter.api.Test;

public class ScoreCollectionTest{ 
  @Test 
  public void answersArithmeticMeanOfTwoNumbers(){ 
    // 1)준비 
    ScoreCollection collection = new ScoreCollection(); 
    collection.add(() -> 5); 
    collection.add(() -> 7);    

    // 2)실행 
    int actualResult = collection.arithmeticMean(); 

    // 3)가정(assert) 
    assertThat(actualResult, eaqualTo(6)); 
  } 
} 

5. answersArithmeticMeanOfTwoNumbers() 테스트 케이스  의미  : 숫자 5와 7을 더하고 arithmeticMean메소드가 6을 반환하는지 확인한다.

  • 준비 구현할 객체를 만들고, 구현 객체로 add()메소드를 두번 호출한다. (테스트 상태 준비)
  • 실행 : 검증 코드 실행( 검증하려는 테스트 케이스 메소드 작성 및 실행) 
    • 자바 프로젝트(JavaTestPrj)위에 마우스 오른쪽 버튼 클릭하고 Run As > JUnit Test 로 실행하면 된다.

테스트 실행 - Run As > JUnit Test

  • 검증(assert, 가정하다) 
    • equalsTo() 매처로 실제 테스트를 통과한 값과 기대되는 값인6을 비교한다. 
      6이면 통과(녹색)  6이 아니면 실패(빨간색)로 처리한다. 

test 케이스 실행 - 통과
test 케이스 실행 - 실패

6. 기본적인 테스트 진행 순서는 아래와 같다. 물론 전제는 간단하게 돌아가는 프로그램은 만들어 놓은 상태여야 한다.

  • 테스트 클래스를 추가한다. 
  • 테스트 메소드 확인하기
  • JUnit 테스트 코드 실행하고 통과하기 

(정리)

  위의 코드대로 실행하면 당연히 test 케이스 실행 - 성공 이 나온다.

  JUnit 테스트로 알아보고자 하는 것은 실질적으로 코드를 구현하고, 이 코드에 문제가 있는지 없는지를 확인하고, 오류가 발생할 만한 케이스를 만들어서 테스트를 돌려보면, 필요한 기능만을 구현할 수 있다. 소스 코드를 분석해 보고, 아래와 같은 질문을 해보자. 

   코드가 정상적으로 동작하는지 확신하려고 추가적인 테스트를 작성할 필요가 있는가? 
   내가 클래스에서 결함이나 한계점을 드러낼 수 있는 테스트를 작성할 수 있을까? 

  지금의 테스트 케이스는 단순한 형태이지만 실제 프로그래밍에서는 이렇게 단순하지 않기 때문에 이런 질문에 확실하게 대답할 수 있도록 해봐야 한다고 책에서는 서술하고 있다.
  보통 테스트 케이스를 만들고 테스트를 해보지 않으면 테스트 하기가 매우 힘들다. 그런데 테스트 케이스를 만들면 미리 값을 넣어서 테스트도 해 볼 수 있고, 결과도 정해서 테스트를 해볼 수 있기때문에 프로그램의 질이 매우 높아진다. 만약에 프로그램을 구현할때 테스트 코드도 계속 작성을 하게되면 기능이 완료되었다고 생각할때 각 테스트 케이스들만 돌리면 문제가 발생하는 부분과 성공되는 케이스를 체크해서 수정하면 훨씬 가성비가 좋게 개발을 할 수 있다. 하지만 테스트 케이스를 만드는 방법과 메소드등을 만들어서 테스트 하는 연습을 해야한다. 그래서 이내용을 지속적으로 정리를 해보려고 한다.