SW/DevOps

DevOps : UnitTest와 JUnit 개념 및 사용법

얇은생각 2019. 12. 17. 07:30
반응형

단위 테스트

 

단위 테스트 트렌드

예전에는 UI 화면이나 장비 등의 필요한 기능을 조작하여 내용을 확인해서 테스트했으나, 현재는 작성한 프로그램을 테스트하기 위한 테스트용 프로그램을 작성후 실행시켜 확인합니다. 테스트용 프로그램을 만들기 보다는 UI 화면으로 테스트하는 것이 빠를 것 같지만, 테스트용 프로그램을 작성하게 되면 같은 내용의 테스트를 반복해서 자동으로 테스트할 수 있는 장점이 있습니다.

 

 

JUnit

많이 사용 되는 JUnit은 단위 테스트 작성을 지원하는 xUnit 계열의 오픈소스 자바 프레임워크입니다. 여기서 xUnit은 단위 테스트 작성을 지원하는 여러 언어별 오픈소스 프레임워크를 말합니다. TDD 개념을 정립하고 애자일 방법론의 한 형태인 XP를 만든 켄트 벡과 GoF 패턴을 집대성한 에릭 감마에 의해서 개발되었습니다.

2018년 초에 나온 JUnit 5는 제약사항으로 런타임 구동 시 자바 8 이상이어야 합니다. 하지만 이전 버전의 JDK로 컴파일 된 코드도 테스트할 수 있습니다. JUnit Platform은 테스트 코드를 찾고 테스트 계획을 생성하는 TestEngine 인터페이스를 정의하고 이를 통해 테스트를 발견/실행/결과를 보고합니다.

TestEngine의 실제 구현체는 별도의 모듈로 존재하는데, 그 모듈 중 하나인 JUnit Jupiter API는 JUnit 5에서 새로 추가된 테스트 코드용 API로 개발자는 Jupiter API를 사용해 테스트 코드를 작성할 수 있습니다. 이는 새로운 어썰션(Assertions), 어노테이션(Annotations), 자바8 람다 표현식 등과 같은 JUnit 5의 확장 모델을 포함합니다. JUnit Vintage는 기존 JUnit 3, 4 버전으로 작성된 테스트 코드 실행을 지원하는 마이그레이션 역할을 합니다.

만약 테스트 코드를 작성하기 위한 새로운 API를 만든다면, 그 API에 알맞은 엔진 모듈을 함께 구현해서 제공하면 JUnit Platform 수정 없이 새로 만든 테스트 API를 실행하고 그 결과를 리포팅할 수 있게 됩니다. JUnit 4는 단일 모듈이지만, JUnit 5는 크게 Platform/Jupiter/Vintage의 세 가지 하위 프로젝트의 모듈로 구성됩니다.

 

 

JUnit5 개요

JUnit 5는 여러 가지 방법으로 설정할 수 있고, Maven 의존성 설정 또는 스프링 부트를 통해서도 가능합니다. Maven2는 단위 테스트를 위해 Surefire 플러그인을 사용하고, mvn test 커맨드로 테스트를 할 수 있습니다. 테스트는 실행 순서에 있어서 좌측의 그림과 우측의 소스 코드를 비교하면서 라이프 사이클을 인지하는 것이 매우 중요합니다.

JUnit 5에서는 JUnit 4보다 변경되거나 확장된 어노테이션이 있으므로 상세 내용을 참고하시기 바랍니다. JUnit 5에서 추가된 어노테이션을 제외하고, JUnit 4와 5의 Assertions은 동일합니다.다만 패키지가 바뀌면서 많이 개선되었으므로, Import 선언 시 주의하시기 바랍니다.

JUnit 5는 자바 8 람다와 같이 사용 가능하게 되면서 메시지 생성을 간단하게 할 수 있습니다. 또한 AssertAll을 사용하여 assertions을 그룹화하여 그룹 내의 실패한 assertions을 MultipleFailuresError 형태로 보고하는 형태로 오류의 정확한 위치를 찾아낼 수 있습니다. Assertions은 특정 조건이 충족되는 경우에만 테스트를 실행하는 데 사용됩니다.

즉, 일반적으로 테스트가 제대로 실행되는 데 필요한 외부 조건이지만, 테스트 중인 항목과 직접 관련이 없는 경우에 사용됩니다. JUnit 5는 JUnit 4보다 더 적은 Assumption을 제공하지만, Java8 람다와 같이 사용 가능합니다.

assumeTrue(), assumeFalse(), assumingThat()을 통해 Assumption을 선언하고, 실패할 경우 TestAbortedException을 Thrown하고 테스트를 건너뛰게 됩니다. 예외처리 테스트 시 JUnit 4에서는 화면 좌측처럼 Test 어노테이션의 expected 속성을 사용하고, JUnit 5에서는 assertThrows() 메서드로 throw된 예외에 대해 더 많은 제어 기능을 제공합니다.

여기서 주의할 점은 예상된 Exception 또는 파생 Exception을 throw할 때 테스트가 성공한다는 것입니다. 지정한 예외가 발생하지 않으면 테스트가 실패하고 throw된 경우 통과하게 됩니다. 타임아웃의 경우도 JUnit 4에서는 화면 좌측처럼 Test 어노테이션의 timeout 속성을 사용하게 되고, JUnit 5에서는 assertTimeout() 메서드를 사용하게 됩니다.

JUnit 5에서는 Test Suits에서 @SelectPackages와 @SelectClasses를 통해 여러 테스트 클래스를 한꺼번에 실행할 수 있습니다. JUnit 4는 라벨과 그룹 테스트를 위해 Category 어노테이션을 사용했었지만, JUnit 5에서는 태깅과 필터링을 위해 Tag 어노테이션을 사용합니다. 파라미터화 테스트는 데이터를 조금씩 바꿔 가면서 여러 차례 반복적으로 검사하는 것을 말합니다.

Dynamic Tests를 통해 런타임에 생성된 테스트 케이스를 선언하고 실행할 수 있습니다. 컴파일 타임에 고정된 수의 테스트 케이스를 정의하는 정적 테스트와 달리, 동적 테스트를 통해 런타임에서 동적으로 테스트 케이스를 정의할 수 있습니다. @TestFactory 메서드는 Private이나 static이면 안 됩니다.

언급되지 않은 JUnit 관련 기타 상세한 내용은 URL을 꼭 참고하시기 바랍니다. 지금까지 설명 드린 단위 테스트만으로는 시스템 동작에 대한 보장을 제공하지 않습니다. 마이크로 시스템의 각 핵심 모듈을 독립적으로 다루었지만, 모듈이 함께 작동하여 완전한 서비스를 형성하거나 원격의 의존성 모듈과 상호 작용하여 여러 구성 요소와 올바르게 상호 작용하는지 확인하려면 보다 확대된 테스트가 필요합니다. 

반응형

'SW > DevOps' 카테고리의 다른 글

DevOps : End-to-End Test 개념, 종류, 방법  (0) 2019.12.20
DevOps : Service Test 종류 및 방법  (0) 2019.12.18
DevOps : UnitTest 개요, 방법  (0) 2019.12.16
DevOps : SW 테스트 개요  (0) 2019.12.15
DevOps : 리팩토링 기법 (3)  (0) 2019.12.14