수업 시간에 배웠던 JUnit5 단위 테스트를 작성해볼까 한당!ㅇㅅㅇ
우선! 간단하게 단위 테스트가 무엇인지 정리하고 실습을 할 것이다.
(진짜 간단하게........)
1. 단위 테스트
단위 테스트는 가장 기본적인 테스트 활동이다.
1-1) 단위 테스트 특징
- 개발 환경에서 수행
- 단위(주로 module, component, sub program, class, method) 간의 연계는 고려하지 않으며 단위 내부의 결함 제거가 목적
- 주로 구조 기반 테스트 설계 기법을 사용 (Whitebox Test)
Q) Whitebox vs Blackbox ??
소프트웨어 테스트 방법론 2가지를 소개하면 화이트박스와 블랙박스이다.
Whitebox = 구조 기반 : 구조(structure based)를 기반으로 하는 테스트로, 내부구조를 분석해 테스트 케이스 도출. (단위 테스트는 개발 환경에서 수행하니까 여기에 해당)
Blackbox = 명세 기반 : 사용자가 요구하는 기능을 측정하기 위해서 내부구조를 모르는 상태로 테스트를 진행하는 방법
경험 기반 : 테스트 엔지니어의 경험, 지식과 직관에 기반하여 테스트 케이스 도출
<whiteBox 테스트>
화이트 박스 테스팅을 하기 위해서는 프로그램 내부 구조를 분석해야 한다.
그리고 테스트하려는 단위를 결정할 때 프로그램 코드상의 수행경로를 정의하고, 그 경로를 커버하는 테스트 케이스를 수행하면 된다.
코드 적용 수준, 즉 수행범위(레벨)에 따라 구문 커버리지, 결정 커버리지, 조건 커버리지 등 있다.
1-2) 단위 테스트 목표
그러면 이번에 실습해볼 구조 기반인 단위 테스트의 목표는 무엇인가!?
- 프로그램상의 모든 경로들을 최소한 한 번은 테스트하는 것
2. JUnit5 실습
실습을 해볼 것은 자바에서 동작하는, 아키텍처가 필요없는 하나의 모듈이 하나의 프로그램이 되는 요구사항이 있었고,
이것을 가지고 단위 테스트를 할 것이다.
2-1) 테스트 대상 - 삼각형 종류
Q) 삼각형의 변의 길이를 나타내는 세 정수 값을 입력하여 삼각형이 부등변 삼각형인지, 이등변 또는 정삼각형인지 보여준다.
먼저 소스 코드를 작성한다.
> 코드 참고
import java.util.Scanner;
public class TriangleProperty {
public static void main(String[] args) {
int a, b, c;
String result;
Scanner scanner = new Scanner(System.in);
a = scanner.nextInt();
b = scanner.nextInt();
c = scanner.nextInt();
scanner.close();
result = classifyTriangle(a, b, c);
System.out.println(result);
}
public static String classifyTriangle(int a, int b, int c) {
if ((a + b <= c) || (a + c <= b) || (b + c <= a))
return "Invalid";
if (a == b && b == c)
return "정삼각형";
if (a == b || b == c || a == c)
return "이등변삼각형";
return "비등변삼각형";
}
}
앞에서 말한
"그리고 테스트하려는 단위를 결정할 때 프로그램 코드상의 수행경로를 정의하고, 그 경로를 커버하는 테스트 케이스를 수행하면 된다. "
=> 여기서 세 정수를 입력 받아 정삼각형인지 이등변, 비등변삼각형인지 알아보는 수행경로를 정의했고,
classifyTriangle 메소드 단위를 테스트할 것이다.
JUnit5 도구를 사용할 것인데 JDK에 설치되어 있다.
프로젝트 오른쪽 버튼을 눌러서 Build Path > Add Libraries 눌러서 JUnit 선택하면 된다.
2-2) 테스트 실행
그리고 작성한 TriangleProperty.java 클래스 파일에 오른쪽 버튼을 눌러서 JUnit Test Case 선택해서 생성해준다.
> 코드 참고
package communication;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class TrianglePropertyTest {
@Test
final void 정삼각형테스트() {
String result = TriangleProperty.classifyTriangle(1, 1, 1);
assertTrue(result.contentEquals("정삼각형"));
}
@Test
final void 이등변삼각형테스트() {
String result = TriangleProperty.classifyTriangle(2, 2, 3);
assertTrue(result.contentEquals("이등변삼각형"));
}
@Test
final void 삼각형테스트() {
String result = TriangleProperty.classifyTriangle(1, 2, 3);
assertTrue(result.contentEquals("Invalid"));
}
@Test
final void 비등변삼각형테스트() {
String result = TriangleProperty.classifyTriangle(3, 4, 5);
assertTrue(result.contentEquals("비등변삼각형"));
}
}
알아보기 쉽도록 일단 메소드명을 한글로 작성했다.
이렇게 코드를 작성해주고 아래처럼 Coverage As > JUnit Test 실행한다.
테스트가 잘 되었다면 아래처럼 파란색으로 표시가 된다. 틀렸을 경우에는 빨간색으로 표시가 된다.
>코드 참고
package communication;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class TrianglePropertyTest {
@Test
final void 정삼각형테스트() {
String result = TriangleProperty.classifyTriangle(1, 1, 1);
assertTrue(result.contentEquals("정삼각형"));
}
@Test
final void 이등변삼각형테스트() {
String result = TriangleProperty.classifyTriangle(2, 2, 3);
assertTrue(result.contentEquals("이등변삼각형"));
}
@Test
final void 삼각형테스트() {
String result = TriangleProperty.classifyTriangle(1, 2, 3);
assertTrue(result.contentEquals("Invalid"));
}
@Test
final void 비등변삼각형테스트() {
String result = TriangleProperty.classifyTriangle(3, 4, 5);
assertTrue(result.contentEquals("비등변삼각형"));
}
}
아래 Coverage를 봐도 TrianglePropertyTest.java 보면 커버리지가 100%된 것을 확인할 수 있다.
되도록이면 커버리지가 100% 가깝게 해주는게 좋다.
여기서!!!!
TriangleProperty.java를 보면 57.6% 밖에 안되어있는데 신경쓰지 않아도 된다.
위에 빨간 부분들은 적용 범위가 아니기 때문에..
그리고 또 하나!!!더!!
노란색으로 표시되어있는 것은 모든 경우의 수를 충족하지 않았을 경우이다.
노란색을 초록색으로 바꾸고 싶다면 아래처럼 모든 경우를 다 작성해서 테스트하면 된다.!
'IT > JAVA' 카테고리의 다른 글
다른 프로젝트에 있는 클래스 import 하기 (0) | 2020.12.17 |
---|---|
[java 프로젝트]자바 스윙을 이용한 소켓 채팅 프로그램 만들기 - KEVotingTalk (0) | 2020.10.24 |
[경고 메시지] The serializable class MainFrame does not declare a static final serialVersionUID field of type long 원인 & 해결 (0) | 2020.10.10 |
macOS mysql 설치 & eclipse java 연동 (4) | 2020.10.09 |