ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 단위테스트 test case : 이클립스에서 Junit 사용법(+intellij)
    JAVA/기타 2024. 6. 17. 16:16

    ▤ 목차

      ✔ 단위 테스트 Junit

      ⌨ 단위 테스트란?

      유닛테스트라고 한다.

      단위 테스트는 하나의 모듈(기능 또는 메소드)을 기준으로 독립으로 진행되는 가장 작은 단위의 테스트를 말한다.

       

      하나의 기능이 올바르게 동작하는지 독립적으로 테스트하는 것

       

      통합 테스트는 실제 여러 컴포넌트들 간의 상호작용을 테스트하기 때문에 모든 컴포넌트들이 구동된 상태에서 테스트를 하게 된다. 단위 테스트는 해당 부분만 독립적으로 테스트하기 때문에 리팩토링시 문제 발생 여부를 확인할 수 있다.

       

      장점

      • 테스팅에 대한 시간과 비용을 절감할 수 있다.
      • 새로운 기능 추가시 테스트가 가능하다.
      • 코드에 대한 설명이 될 수 있다.
      • 리팩토링 시 문제 발생 여부를 확인하여 안정성을 확보할 수 있다.

       

      🔦 가짜 객체(Mock Object)

      보통 객체는 데이터를 주고 받으며 기능을 처리한다.

      하지만 유닛 테스트(단위 테스트)는 독립적으로 테스트를 진행하기 때문에 실제로 어플리케이션에서 기능 상태를 확인하기 어렵다. 이때 가짜 객체(Mock Object)와 스텁(stub)의 개념이 등장한다. 이 두 객체는 테스트 더블의 일종이다.

       

      Mock 객체모의 객체라고도 한다. 수행할 모듈과 연결되는 외부의 다른 서비스나 모듈들을 실제 사용하는 모듈을 흉내 내는 가짜 모듈을 작성하여 테스트의 효용성을 높이는데 사용하는 객체이다. 출력(output)에 관한 것이다.

       

      stub(스텁)은 소프트웨어 테스트를 하는데 입력(input)에 관한 것이다.

       

      🔷 테스트 코드의 5가지 규칙 (FIRST)

      • Fast : 단순한 목적을 설정해서 작성하거나 외부 환경을 사용하지 않는 단위 테스트를 작성해서 빠르게 수행되어야한다.
      • lsolation : 하나의 테스트 코드는 목적으로 여기는 하나의 대상에 대해서만 수행되어야 한다.
      • Repeatable : 어떤 환경에서도 반복이 가능하도록 해야한다. 개발 환경의 변화, 네트워크의 연결 여부와 상관없이 수행이 가능해야한다.
      • Self-Validation : 테스트 자체로 검증이 완료되어야한다. 결과값과 기대값을 비교하는 작업을 코드가 하도록 해야한다.
      • Timely : 애플리케이션 코드를 구현하기 전에 완성되어야 한다.

       

      💻 Junit

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

      • 현재 가장 많이 사용되고 있는 버전은 Junit5를 많이 사용한다.
      • 자바 8 이상을 필요하다.

       

       

      ✏️TDD

      https://inpa.tistory.com/entry/QA-%F0%9F%93%9A-TDD-%EB%B0%A9%EB%B2%95%EB%A1%A0-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A3%BC%EB%8F%84-%EA%B0%9C%EB%B0%9C

       

       

      https://dazz6study.tistory.com/33

       

      👏 중요

      스레드 단위로 실행된다.

       

       


       

       

      단위 테스트 환경 설정(+intellij)

      ⌨ 이클립스 테스트 클래스 만들기

      1. 프로젝트를 클릭하고 우클릭 > properties 선택 혹은 Build Path선택하기

      2. Libraries 선택한 후 Add Library.. 선택하기

       

      3. Junit을 선택해준다. (Junit 4 혹은 5 버전을 선택)

       

       

      💻 intellij 테스트 클래스 만들기

      1. 테스트를 원하는 클래스를 블록 지정한 다음 ctrl + shift + T를 눌러준다.

      2.창에서 지정해준다. 

      1) Class Name : 생성할 테스트 클래스명을 설정해준다. 기본 설정(클래스명 + Test)

      2) SuperClass : 테스트 클래스의 부모 클래스 지정

      3) Destination package : 원본 클래스의 패키지 경로. test 폴더 안에 동일한 패키지 경로로 생성

       

      3. 생성은 되었지만 junit클래스 패치를 안해서 아래와 같이 오류가 나왔다.

      4. junit 4버전이나 5버전 클래스 패치를 하면되는데, 5 버전으로 선택했다.

       

      5. 테스트 클래스가 완료되었다.

       

       

       

       


       

       

      ✔단위 테스트

      public class Calculator {
      	public Calculator() {
      	}
      
      	public int plus(int a, int b) {
      		return a + b;
      	}
      
      	public int minus(int a, int b) {
      		return a - b;
      	}
      
      	public int multi(int a, int b) {
      		return a * b;
      	}
      
      	public int divide(int a, int b) {
      		return a / b;
      	}
      }

      이와 같은 클래스가 있다고 가정하자.

      해당 클래스가 정상적으로 실행이 되는지 확인해야한다.

       

      ⌨ @Test

      public class CalculatorTest {
      		
      	@Test
      	public void testPlus() {
          	fail("Not yet implemented");
      	}
      
      	@Test
      	public void testMulti() {
      		fail("Not yet implemented");
      	}
      
      	@Test
      	public void testDivide() {
          	fail("Not yet implemented");
      	}
      }

      파일을 실행하고나면 아래와 같은 코드가 나타난다.

       

      💻 코드로 보기

      public class CalculatorTest {
      	//Calculator calculator = new Calculator();
      	Calculator calculator;
      	
      	@Before //테스트 전에 초기화하는 경우, 다른 어노테이션보다 먼저되는 어노테이션
      	public void setup() {
      		calculator = new Calculator();
      	}
      	
      	@Test
      	public void testPlus() {
      		assertTrue(calculator.plus(8, 4) == 12);
      //		fail("Not yet implemented");
      		
      		int a = 8, b = 7;
      		assertEquals(a, b); //변수의 값이 같은지 확인
      		
      		int[] arr = {0,0};
      		int arr2[] = new int[2];
      		assertArrayEquals(arr, arr2);
      	}
      
      	@Ignore //Test를 진행하지 않는다.
      	@Test
      	public void testMulti() {
      		fail("Not yet implemented");
      	}
      
      	@Test(timeout =1000) //1초단위로 수행시간 검사
      	public void testDivide() {
      		assertTrue(calculator.divide(8, 4)==2);
      		//assertTrue(calculator.divide(10, 4)==2.5);
      		
      		for (int i = 0; i < 1000000; i++) {
      			System.out.print(i+ " ");
      		}
      		
      		
      	}
      
      }

      testMulti()는 무시해달라는 어노테이션이 달려있기에 test가 진행되지 않을 것이다.

      testPlus()를 보면 같은 값인지 확인하는 메서드에 8과 7을 넣었다. 아마 결과는 실패가 나왔을 것이다.

      testDivide()에는 for문을 1000000번을 반복하는데 실행시간에 제한을 줬다. 1초 이내로 돌아야 성공인데, 결과는 어떻게 나올까?

       

      결과

       

      👏 중요

      개발자가 원하는대로 구현되었는지 확인할 수 있다.

      실행 시간에 제한을 줄 수도 있고 원하는 작은 모듈을 검사해볼 수 있다는 장점이 있다. 

       

       

      😊참고 자료

      https://jelong.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EC%97%90%EC%84%9C-JUnit-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

       

      [Java] 이클립스에서 JUnit 사용법: 간편하게 test case 작성하기

      Junit이란 이클립스는 대표적인 자바 개발 툴 중 하나이며, JUnit은 자바 개발에서 단위 테스트를 위한 대표적인 프레임워크입니다. 이번 글에서는 이클립스에서 JUnit을 설정하는 방법을 알아보겠

      jelong.tistory.com

      https://innovation123.tistory.com/49

       

      [JUnit] 테스트 코드 작성과 단위테스트 Unit Test

      JUnit Java용 유닛 테스트 프레임워크이다. 소프트웨어 개발 시에 단위테스트(Unit Testing)는 중요한 절차이다. 프로그램을 작은 unit 단위로 쪼개어 각각 잘 동작하는지 검사함으로써 프로그램의 안

      innovation123.tistory.com

       

    Designed by Tistory.