Skip to Content
Suffering builds character
아카이브12.테스팅개요2.JUnit

2.JUnit

JUnit은 앞서 확인한 간이 테스트 프레임워크의 특징이자, 단점들을 해소하여 미리 구현해놓은 단위 테스트 프레임워크로,
개발자는 구현한 기능에 대해 테스트 코드만 작성할 수 있도록 지원하며, 그 외에도 여러 상황에 대한 테스트를 수행할 수 있도록 다양한 기능을 제공함

1. Calculator를 JUnit으로 테스트하기

JUnit5 버전을 활용하여 Calculator를 테스트하는 코드를 작성한 결과는 다음과 같음

CalculatorTest.java
// import.. public class CalculatorTest { @Test // '하나의 테스트 케이스'를 나타내는 Annotation public void testAdd() { // 테스트 메서드의 반환타입은 void이어야 함 Calculator calculator = new Calculator(); double result = calculator.add(3, 5); assertEquals(8, result, 0); } @Test // 다른 테스트 케이스 - 뺄셈 기능 public void testSub() { Calculator calculator = new Calculator(); double result = calculator.sub(5, 3); assertEquals(2, result, 0); } }

1. 테스트 대상별로 격리된 환경 제공

JUnit은 @Test 를 통해 앞서 간이 테스트 프레임워크에서 확인한 다음의 특성을 추상화된 Annotation의 형태로 제공하고 있음
→ 단위 테스트는 다른 단위 테스트와 독립적으로 실행되어야 함

CalculatorTest.java
// import.. public class CalculatorTest { @Test // '하나의 테스트 케이스'를 나타내는 Annotation public void testAdd() { // 테스트 메서드의 반환타입은 void이어야 함 Calculator calculator = new Calculator(); double result = calculator.add(3, 5); assertEquals(8, result, 0); } @Test // 다른 테스트 케이스 - 뺄셈 기능 public void testSub() { Calculator calculator = new Calculator(); double result = calculator.sub(5, 3); assertEquals(2, result, 0); } }

JUnit은 테스트 메서드들 간의(testAdd, testSub) 격리된 환경을 보장하고, 의도하지 않은 부수효과(SideEffect)를 방지하기 위해 @Test 메서드를 호출하기 전에 테스트 클래스 인스턴스(CalculatorTest)를 매번 새로 생성함

왜냐하면 테스트는 실행 순서에 관계ㅔ없이 항상 동일한 결과를 얻을 수 있어야 하기 때문
→ 뺄셈 기능 테스트인 testSub()를 실행하고 testAdd()를 실행했을 때와 그 반대로 실행했을 때 각 테스트케이스들의 성공/실패 결과가 다르면 안됨

2. 단정문을 통해 테스트 수행 결과 확인하기

JUnit은 테스트 수행에 따른 성공/실패 결과를 확인하기 위한 유틸 메서드를 제공하며 이를 단정문(Assertion)이라고 함

CalculatorTest.java
// import.. public class CalculatorTest { @Test // '하나의 테스트 케이스'를 나타내는 Annotation public void testAdd() { // 테스트 메서드의 반환타입은 void이어야 함 Calculator calculator = new Calculator(); double result = calculator.add(3, 5); assertEquals(8, result, 0); } @Test // 다른 테스트 케이스 - 뺄셈 기능 public void testSub() { Calculator calculator = new Calculator(); double result = calculator.sub(5, 3); assertEquals(2, result, 0); } }

이를 통해 개발자는 아래와 같이 테스트 성공/실패에 따른 별도의 분기 로직을 작성할 필요가 없음

CalculatorTest.java
if (result != 8) { // 예외를 던지도록 지정 throw new IllegalStateException("잘못된 결과: " + result); } else { System.out.println("테스트 성공: " + result); }

테스트 케이스에 단언문 메서드 작성이 누락될 경우, JUnit 테스트 프레임워크는 테스트 성공으로 응답하기 때문에 거짓 양성(False positive, 오탐)이 발생할 수 있기 때문에 주의해야 함

CalculatorTest.java
// import.. public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); double result = calculator.add(3, 5); // assertEquals(8, result, 0); } }

→ 테스트 성공(?)

Last updated on