졸업 프로젝트를 하면서 블로그에 한동안 뜸해졌다.

졸프를 하면서 jUnit을 활용해 TDD방식의 개발을 도전해보려고 했지만

시간과 인적자원의 문제로 인해 활용하지 못했던

졸프가 마무리 된 지금 jUnit에 대해 다시 한번 면밀하게 공부해 보려고 한다.







JUnit이란?

  • Java에서 독립된 단위테스트를 지원해주는 프레임워크이다.

  • 보이지 않고 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위테스트를 쉽게 해주는 테스트 지원 프레임워크이다.



단위테스트

  • 소스코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.

  • 모든 함수와 메소드에 대한 테스트 케이스를 작성하는 절차를 말한다.



특징

  • assert 메서드로 테스트 케이스의 수행 결과를 판별한다. (ex. assertEquals(expect, actual))

  • JUnit4부터는 테스트를 지원하는 어노테이션을 제공한다.(ex. @Test, @Before, @After)

  • @Test 메서드가 호출할 떄 마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지게 한다.

JUnit4 Test Annotation

@Test

테스트를 수행하는 메소드를 지정한다. JUnit에서는 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행되는 것을 지향한다.

@Ignore

테스트를 실행하지 않도록 해준다. 메서드는 남겨두되 테스트에 포함되지 않도록 하려면 이 어노테이션을 사용하면 된다.

@Before/@After

테스트 메서드가 실행되기 전과 후로 실행되는 메서드를 지정합니다. 공통적으로 실행되어야 하는 메서드가 있다면 이 어노테이션을 사용하면 된다.

@BeforeClass/@AfterClass

각각의 메서드가 아닌 해당 클래스에서 딱 한번만 수행되는 메서드이다. 테스트 메서드와 갯수와 상관없이 딱 한번만 실행된다.

Spring Test Annotation(JUnit4)

@RunWith(SpringJUnit4ClassRunner.class)

ApplicationContext를 만들고 관리하는 작업을 할 수 있도록 JUnit의 기능을 확장해준다. 스프링의 핵심 기능인 컨테이너 객체를 생성해 테스트에 사용할 수 있도록 해준다. JUnit에서는 테스트 메서드별로 객체를 따로 생성해 관리하는 반면에 Spring-Test 라이브러리로 확장된 JUnit에서는 컨테이너 기술을 써서 싱글톤으로 관리되는 객체를 사용해 모든 테스트에서 사용 가능하다.

@ContextConfiguration(locations = "classpath.xml/파일위치")

스프링 빈(Bean) 설정 파일의 위치를 지정할 수 있다. 굳이 별도로 컨테이너를 추가하지 않고 Bean을 등록해둔 xml 파일을 지정해 컨테이너에서 사용할 수 있도록 해준다. 위의 @RunWith 어노테이션은 컨테이너를 생성하겠다는 의미인데, 어떤 파일을 참조할지 모르는 상태이기 떄문에 이 어노테이션을 함께 써줘야 한다.

파일 위치의 루트는 "src/test/resources"폴더이다. 필요한 설정 파일은 이곳에 복사해놓고 사용 가능하다. 하지만 파일을 매번 복사하면 굉장히 번거롭기 떄문에 "file:Full path"형식으로 써주면 운영 및 개발에서 필요로 하는 파일들을 불러올 수 있다. 중괄호 {}를 붙이면 여러개의 파일을 가져올 수 있다.

@Autowired

스프링에서 사용하는 것과 같다. 자동으로 의존성 주입을 해준다.

JUnit4와 JUnit5 비교

1. Supported Java Version

2. Architecture

  • JUnit4는 단일jar로 구성되어 있고 JUnit5는 크게 JUnit Platform, JUnit Jupiter, JUnit Vintage모듈로 구성되어있다.

  • JUnit5는 테스트 작성자를 위한 API 모듈과 테스트 실행을 위한 API가 분리되어 있다.

       ex) JUnit Jupiter는 테스트 코드 작성에 필요한 junit-jupiter-api 모듈과 테스트 실행을 위한 junit-jupiter-engine 모듈로 분리되어 있다.

3. JUnit5 Architecture


4. Annotations


5. 추가 Annotations

  • @TestMethodOrder & @Order (JUnit 4 : @FixMethodOrder)

   - 테스트 클래스 내에서 메서드의 실행 순서를 선택할 수 있다.

  • @ExtendWith (JUnit 4 : @Rule & @ClassRule)

   - @Rule annotation은 테스트 케이스에 특정 규칙을 적용하는 데 동무이 되는 TestRule 클래스에서 확장된다.

   - 예 : 테스트 케이스 실행 전 임시 폴더 생성 및 실행 후 폴더 삭제는 Rule을 통해 설정할 수 있다.

   - @Rule은 JUnit 5 Vintage에서 사용할 수 있는 JUnit 4에서만 사용할 수 있지만 @ExtendWith는 JUnit 5에 더 가까운 기능을 제공한다.
    마찬가지로 @Rule을 사용하여 글로벌 타임 아웃을 설정할 수 있다.

  • @TestFactory (JUnit 4 : x)

   - JUnit5 에서만 지원되며 동적 또는 런타임 테스트 생성에 도움이 된다.

   - 데이터 스트림을 컬렉션으로 반환하며 수명주기 콜백 주석을 사용할 수 없다.

  • @Nested (JUnit 4 : x)

   - JUnit Jupiter에서만 지원된다.

   - 중첩 된 테스트 케이스를 생성하는 데 도움이 된다.
     ex) 테스트 케이스 1번이 있는 클래스 1번에는 테스트 케이스 2번이 있는 @Nested 클래스 2번이 있을 수 있다.
         이렇게 하면 테스트 케이스 1에 대한 중첩 테스트 케이스가 된다. 따라서 테스트 케이스 1번이 실행 된 다음 테스트 케이스 2번이 실행된다.

   - @Nested 주석을 사용하지 않으면 중첩 된 클래스가 실행되지 않는다.

  • @Tag (JUnit 4 : @Category)

   - 테스트에 태그를 지정하고 필터링하는 데 도움이 된다.

   - 실행할 테스트를 포함하거나 해당 카테고리에 따라 필터링하여 제외 할 수 있다.

  • @ParameterizedTest / @ValueSource (JUnit4 : @RunWith(Parameterized.class) / @Parameterized .Parameters)

   - 테스트 데이터 변형이 있는 메서드를 여러 번 실행하는 데 사용된다.

   - JUnit4는 @RunWith 및 @Parameters를 지원하는 반면 JUnit5 Jupiter는 @ValueSource와 함께 @ParamaterizedTest를 지원한다.

  • @RepeatedTest (JUnit 4 : x)

   - JUnit5는 @RepeatedTest 주석을 사용하여 일정 횟수 동안 테스트 메서드의 반복 시행을 지원한다.

  • @DisplayName (JUnit 4 : x)

   - 사용자 정의 이름을 표시 목적으로 테스트 메서드 또는 클래스에 지정할 수 있다.

  • @TestInstance (LifeCycle.PER_CLASS) and @ TestInstance (LifeCycle.PER_METHOD) (JUnit 4 : x)

   - JUnit5는 테스트 라이프 사이클 구성을 지원합니다.

   - JUnit4와 5는 모두 기본 메서드 라이프 사이클 콜백을 따르며 클래스 별 구성도 수행 할 수 있다.

profile
성장하는 개발자

0개의 댓글