Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

IT could be

JUnit 첫걸음 본문

Test Code ✔

JUnit 첫걸음

얘진 2023. 1. 5. 00:15

JUnit - 단위 테스트 프레임워크

에릭 감마와 켄트 백이 자바를 위한 간단하고도 효율적인 단위 테스트 프레임 워크를 만들었다. 이 단위 테스트 프레임워크 가 JUnit이다.

 

프레임워크 : 거의 완성된 애플리케이션. 여러 애플리케이션에서 공유할 수 있는 재활용 가능하고 보편적인 구조를 제공한다. 개발자들은 이 프레임워크를 애플리케이션에 통합하고 특정 요구사항에 부합하도록 기능을 확장할 수 있다.

 

단위테스트

다른 단위들에 종속되지 않은 하나의 명확한 작업 단위(보통 하나의 메서드)에 대한 테스트

개발자의 관점에서는 '메스드가 기대 범위의 입력을 받아, 각 입력에 대해 기대한 값을 반환하는지 확인'

 

통합 테스트 or 인수 테스트

다양한 컴포넌트(여러 개의 프로그램 함수들을 모아 하나의 특정한 기능을 수행할 수 있도록 구성한 작은 기능적 단위) 사이의 상호작용을 검증한다. 

 

API 계약

API(애플리케이션 프로그래밍 인터페이스)의 호출자와 피호출자 간의 공식 합의로 바라보는 관점

즉, 메서드로 만드는 API 요청과 결과값의 과정(동작)

 

JUnit의 설계 목표

- 유용한 테스트를 작성하는 데 보탬이 되어야 한다.

- 시간이 지나도 가치가 변치 않는 테스트를 작성하는 데 보탬이 되어야 한다.

- 코드 재사용을 통해 테스트 작성 비용을 낮추는 데 보탬이 되어야 한다.

 

JUnit의 오장육부 (Test Class , Test Suit , Test Runner)

Test Class

테스트 메소드를 포함하여 테스트를 실시하는 클래스

@Test 부여된 테스트를 하나 이상 포함한다.

  • public 클래스여야 한다.
  • 파라미터를 받지 않는 생성자를 제공해야 한다.

Test Method

test 내용이 들어있는 method

  • public 메소드여야 한다.
  • 파라미터를 받아선 안된다.
  • 반환형은 void

Assert 메소드

테스트 검증할 때 JUnit의 Assert 클래스에 정의된 assert 메소드를 사용한다.

  • 파라미터를 2개 받는 assert 메소드들은 첫번째 파라미터에는 '예상값' 두번째 파라미터에는 '실제값'을 의미하는 패턴을 따름
  • assert 메소드를 호출할 때는 에러 메세지도 함께 기입하는 습관을 가지는게 좋음 assert가 실패했을 때, 무엇이 잘못되었는지 사람이 읽고 이해할 수 있도록 

 

Test Suit

테스트들의 집합으로, 관련된 테스트들을 함께 묶는 수단이다.

테스트 클래스에 별도의 테스트 스위트가 정의되지 않았으면 JUnit은 테스트 클래스 내의 모든 테스트를 포함하는 테스트 스위트를 자동으로 만들어준다. 보통 같은 패키지 내의 테스트 클래스들은 묶는데 사용

(스위트의 스위트를 만들 수 도 있다.)

@RunWith(value=org.junit.runners.Suite.class)
@SuiteClasses(value={FolderConfigurationTest.class,
					 FileConfigurationTest.class})
public class FileSystemConfiguarationTest Suite{
}

 

Test Runner

테스트 스위트 실행 엔진

 

테스트 러너의 종류

org.junit.internal.runners.JUnit38ClassRunner - 하위 호환 목적으로 제공되는 러너(JUnit 3.8 테스트 케이스 전용)

org.junit.runners.JUnit4 - JUnit 4 스타일의 테스트 케이스 실행

org,junit.runners.Parameterized - 같은 테스트 케이스를 다른 입력 값을 사용해 반복 수행

org.junit.runners.Suite - 복수의 테스트를 묶을 수 있는 집합 (테스트 클래스 내의 @Test 메서드를 찾아 실행하는 러너)

 

파라미터화 테스트 (parameterized)

하나의 테스트를 여러 번 반복 실행하는 기능을 제공

똑같은 테스트의 단순 반복을 의미하는게 아니라 테스트에 사용되는 각종 데이터를 파라미터롤 뽑아내고 뽑아낸 파라미터의 값을 매번 바꿔서 테스트를 호출한다.

 

<JUnit 4>

파라미터화 테스트 러너를 사용하기 위해서는 @Runwith 어노테이션을 사용하고 파라미터로 Parameterized 클래스를 사용한다.

파라미터로는 @Parameters 어노테이션을 사용해서 메소드의 시그니처는 Collection이어야 하며 어떤 파라미터도 받으면 안된다. Collection의 원소 배열은 길이가 모두 같아야 하고 그 길이와 생성자가 받는 파라미터의 수와도 일치해야 한다.

테스트의 반복 횟수는 컬렉션의 크기와 같다.

@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {     
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
           });
    }

    private int fInput;

    private int fExpected;

    public FibonacciTest(int input, int expected) {
        this.fInput = input;
        this.fExpected = expected;
    }

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

 

<JUnit 5>

@Test 대신 @ParameterizedTest 사용하고

테스트 메소드에서 사용할 인수 소스를 하나 이상 선언해야 한다.

인수 소스는 @ValueSource 를 사용해서 넘겨준다. 

@ParameterizedTest
@ValueSource(strings = { "racecar", "radar", "able was I ere I saw elba" })
void palindromes(String candidate) {
    assertTrue(StringUtils.isPalindrome(candidate));
}

 

JUnitCore 퍼사드

디자인 패턴 : 퍼사드

하위 시스템이 제공하는 다수의 인터페이스를 통합해 하나으 ㅣ인터페이스로 제공하는 디자인 패턴

 

Junit 퍼사드는 테스트에 사용할 러너를 스스로 정하고 테스트 수행은 물론, 결과 취합과 통계까지 제공하는 종합 선물 세트

 

정리

테스트 클래스는 도메인 객체 하나를 테스트 할 때 사용하자.

테스트 메서드들은 하나의 도메인 메서드 혹은 밀접하게 연관된 특정 메서드 집합을 테스트하는데 집중하고 어노테이션을 적극 활용하자.

테스트 스위트는 관련된 테스트 클래스들을 묶어 그룹 단위로 실행하고자할 때 사용한다.

테스트 러너는 단위 테스트나 테스트 스위트를 실행하는 데 쓰인다.

Comments