http://www.yes24.com/Product/Goods/31869154
본 글은 위 도서를 학습하면서 필요한 부분을 정리한 내용이다. JUnit을 활용해 단일 테스트를 하는 것이 콘솔로 확인, 시간이 지난 후에도 안정성 있게 확인할 수 있다고 한다. 도서에서는 이클립스로 설명하고 있어, IntelliJ로 활용하는 법을 찾아보고 정리해본다.
JUnit은 자바 언어용 단위 테스트 프레임워크입니다. JUnit은 단위 테스트 작성을 위한 여러 가지 기능을 제공하여, 개발자가 테스트 코드를 쉽게 작성하고 실행할 수 있도록 도와줍니다.
JUnit의 특징은 다음과 같습니다.
애노테이션을 이용한 테스트 메소드 정의: JUnit에서 테스트 메소드는 @Test 애노테이션을 이용하여 정의합니다. 이를 이용하면 메소드가 테스트 메소드임을 명시적으로 나타낼 수 있습니다. Assert 메소드 제공: JUnit에서 제공하는 Assert 메소드를 이용하여 테스트 결과를 검증할 수 있습니다. 예를 들어, assertEquals 메소드를 이용하여 두 값이 동일한지 검증할 수 있습니다.
Maven 방식
New project로 Build System Maven으로 설정 후 프로젝트 생성
디렉토리 구조에서 Main, Test 디렉토리에 각각 junitdemo 패키지를 생성한 후 java 파일을 각각 생성한다.
Calculator.java
package junitdemo;
public class Calculator {
public int add(int a, int b) {
return a+b;
}
}
CalculatorTests.java
import junitdemo.Calculator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class CalculatorTests {
private final Calculator _calculater = new Calculator();
@Test
public void testAddition() {
var actualResult = _calculater.add(1, 1);
Assertions.assertEquals(2, actualResult);
}
}
위 테스트코드에서 Assertions를 사용하기 위해서는 위 디렉토리 구조에서 pom.xml에 dependency를 추가 해줘야한다.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>JUnitTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
위 코드 중 <dependencies>~~~</dependencies> 를 추가해주어 Assertions 함수를 사용하고, @Test 어노테이션을 추가하니 단일 테스트가 가능하였다.
위 영상을 참고로 JUnit maven 방식으로 테스트를 해보았다.
JUnit Gradle의 경우
아직은 잘 모르겠지만 위와 같이 Build system을 Gradle로 설정해주고 생성하니 build.gradle에
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
아래 코드가 자동으로 생성되어 있어, 테스트 코드를 바로 사용할 수 있었다.
JUnit5
JUnit 5는 2017년에 출시된 JUnit 프레임워크의 최신 버전입니다. JUnit 5는 JUnit 4와 달리 모듈화, 확장성, 테스트 라이프 사이클 등을 개선하였습니다. JUnit 5의 주요 특징은 다음과 같습니다.
JUnit Platform: JUnit 5는 새로운 테스트 엔진인 JUnit Platform을 제공합니다. 이 플랫폼은 JUnit 5와 같은 테스트 라이브러리들이 동작할 수 있는 표준 테스트 런처를 제공합니다.
JUnit Jupiter: JUnit 5에서 새로운 기능과 애노테이션을 포함한 JUnit Jupiter를 도입하였습니다. JUnit Jupiter에서는 @Test, @Before, @After 등의 애노테이션을 이용하여 테스트를 작성할 수 있습니다.
JUnit Vintage: JUnit 5에서는 JUnit 4의 지원도 제공합니다. 이를 위해 JUnit Vintage라는 모듈을 제공합니다. 이 모듈은 JUnit 5의 JUnit Platform에서 JUnit 4의 테스트를 실행할 수 있도록 지원합니다.
테스트 인스턴스 생명주기: JUnit 5에서는 테스트 인스턴스의 생명주기를 설정할 수 있습니다. 즉, 각각의 테스트가 실행될 때마다 새로운 인스턴스를 생성하거나, 하나의 인스턴스를 계속 유지할 수 있습니다.
확장 모델: JUnit 5에서는 테스트 환경을 확장하기 위한 확장 모델을 제공합니다. 이를 이용하여 커스텀한 확장을 만들어 사용할 수 있습니다.
태깅과 필터링: JUnit 5에서는 태깅과 필터링을 지원합니다. 즉, 각각의 테스트에 태그를 달아서 특정 테스트만 실행하거나, 제외할 수 있습니다.
JUnit 5는 JUnit 프레임워크의 최신 버전으로, 새로운 기능과 개선된 기능을 제공합니다. 테스트 코드를 작성하여 버그를 발견하고, 이를 수정하여 코드의 품질을 높일 수 있습니다
JUnit5 Annotation
@Test : 테스트 메서드라는 것을 나타내는 어노테이션
@BeforAll : 해당 클래스에 위치한 모든 테스트 메서드 실행 전에 딱 한번 실행되는 메서드
@AfterAll : 해당 클래스에 위치한 모든 테스트 메서드 실행 후에 딱 한번 실행되는 메서드
- JUnit4의 @BeforeClass / @AfterClass와 유사
@BeforeEach : 해당 클래스에 위치한 모든 테스트 메서드 실행 전에 실행되는 메서드
@AfterEach : 해당 클래스에 위치한 모든 테서트 메서드 실행 후에 실행되는 메서드
- JUnit4의 @Before / @After와 유사, 매 테스트 메서드마다 새로운 클래스를 생성(new)하여 실행
@Disabled : 테스트하고 싶지 않은 클래스나 메서드에 붙이는 어노테이션
@DisplayName : 어떤 테스트인지 쉽게 표현할 수 있도록 해주는 어노테이션(공백, Emoji, 특수문자 등을 모두 지원)
@RepeatedTest : 특정 테스트 반복시키고 싶을 때 사용하는 어노테이션, 반복 횟수와 반복 테스트 이름을 설정 가능
@Nested : 테스트 클래스 안에서 내부 클래스를 정의하여 테스트를 계층화 할 때 사용
내부 클래스는 부모클래스의 멤버 필드에 접근 가능, Before/After와 같은 테스트 생명 주기에 관계된 메소드들도 계층에 맞춰 동작
JUnit5 Assertions
assertAll : 매개변수로 받는 모든 테스트코드를 한 번에 실행, 오류가 나도 끝까지 실행한 뒤 한번에 모아서 출력
assertThrows : 예외 발생을 확인하는 테스트
assetTimeout(Duration, Executable) : 특정 시간 안에 실행이 완료되는 지 확인
JUnit5에 대해서 알고 싶다면 아래 영상을 한번 보면 많은 도움이 될 듯 하다.
To Do : 도서 내용에서는 문자열 계산기를 직접 만들어 보고, 저자가 작성한 코드와 비교해보길 원하고 있어
문자열 계산기를 구현해봐야 겠다. 도서의 문자열 계산기 요구 사항으로 아래와 같다.
- 쉼표(,) 또는 클론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 변환한다.
ex) " " -> 0, "1,2" -> 3 , "1,2,3" -> 6 "1,2:3", 6
- 앞의 기본 구분자(쉼표, 클론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다 예를 들어 "//;\n1;2;3"과 같이 값을 입력한 경우 커스텀 구분자는 세미클론(;)이며, 결과 값은 6이 반환되어야 한다.
- 문자열 계산기에 음수를 전달하는 경우 RuntimeException으로 예외 처리를 해야한다.
'Java' 카테고리의 다른 글
[Java] For문 보다 Stream? (0) | 2023.04.01 |
---|---|
[자료 구조] 그래프 : DFS, BFS (0) | 2023.03.30 |
[Java] Collection Set 정리하기 (0) | 2023.03.29 |
[Java] 03/28 알고리즘 문제 (0) | 2023.03.29 |
[알고리즘] 최소 신장 트리(Minimum Spanning Tree) (0) | 2023.03.25 |