[유닛 테스트] 1.개념

rin·2020년 4월 7일
2

유닛 테스트

목록 보기
1/4
post-thumbnail

테스트 코드 하나를 작성하는데 몇 시간을 들인 경험을 했다.
서비스 로직 만큼 중요한 것이 테스트 코드를 작성하는 것이라고는 하나, 실제 로직을 작성하는 것보다 테스트 코드를 작성하는데 더 많은 시간이 드는 것(...)은 배보다 배꼽이 큰 격 아닌가?
테스트 코드 작성 방식을 익히고, 같은 부분을 또다시 삽질하지 않도록 기록으로 남긴다.

Unit Test와 Integration Test

👉 간단한 예시를 먼저 보자.
다음과 같은 맛집 추천 프로그램을 작성했다.


  1. '맛집 정보'라는 엔티티가 존재한다.
  2. '맛집 정보 등록'이라는 메소드 save가 존재한다.
  3. '추천 목록'이라는 엔티티가 존재한다.
  4. 특정 기준으로 '맛집 정보'를 가져오는 메소드 get이 존재한다.
  5. '추천 목록'에 4에서 가져온 '맛집 정보'를 추가하는 메소드 add가 존재한다.

여기서 Unit Test는 save, get, add라는 단일 메소드가 잘 수행되는지, 혹은 엔티티를 가공하는 단일 메소드가 잘 수행되는지 각각의 메소드를 별개로 테스트 하는 작업이며, Integration Test는 save후 get하여 add하는 일련의 과정, 즉 여러 메소드의 복합적 수행에 대해 테스트 하는 작업이다.

Unit Test : 간단, 명확

전체 코드 중 작은 부분을 테스트한다. 즉, 함수 하나하나 개별로 테스트 코드로 작성한다.
같은 input에 대해 항상 같은 output을 보장함을 판단하는 테스트이다.
네트워크나 데이터베이스같은 외부 리소스가 포함되면 유닛 테스트라고 할 수 없으므로 Mock객체를 사용하게 된다.

Integration Test : 상호작용, 통신

시스템들이 올바르게 상호작용하여 작동하는 것을 테스트한다.
실제 외부 리소스와 통신하도록 작성해야하므로, 분리된 시스템끼리 잘 통신하고 있는지 증명하고자 할 때도 사용된다.

👉Unit Test : 어떤 부분에 문제가 있고 고칠 부분이 어디인지 명확하게 해준다.
👉Integration Test : 이벤트 흐름에 이상이 없는지 테스팅하는데 좋다.

JUnit

ref. https://junit.org/junit5/
ref. https://kimseunghyun76.tistory.com/432

자바 프로그래밍 언어용 유닛 테스트 프레임워크
테스트 주도 개발(TDD) 면에서 중요하며 SUnit과 함께 시작된 XUnit이라는 이름의 유닛 테스트 프레임워크 계열의 하나이다.

JUnit4에서 JUnit5로..

📌JUnit4가 단일 Jar였으나, JUnit5는 JUnit Platform, JUnit Jupiter, JUnit Vintage 모듈로 구성돼있다.

  • JUnit Platform
    JUnit Platform 상에서 가동되는 테스팅 프레임워크를 개발하는데 필요한 TestEngine API를 정의한다.
  • JUnit Jupiter
    JUnit5로 테스트를 작성하기 위한 새로운 프로그래밍과 확장 모델들을 포함하고 있다.
    JUnit4와 비교했을 때 새로운 어노테이션은 다음과 같다
AnnotaionDescriptionJUnit4
@TestFactory동적 테스트들을 위한 테스트 팩토리인 메서드를 나타낸다.
@DisplayName테스트 클래스나 테스트 메서드를 위한 커스텀 디스플레이 네임을 정의한다.
@Nestednested, non-static 테스트 클래스임을 나타낸다.
@Tag필터링 테스트들을 위한 태그들을 정의한다. 테스트를 그룹핑하고 필터링한다.@Categories
@ExtendWith커스텀 Extensions을 등록할 때 사용된다.
@BeforeEach각각의 테스트 메서드 실행 직전에 수행된다.@Before
@AfterEach각각의 테스트 메서드 실행 직후에 수행된다.@After
@BeforeAll현재 클래스의 모든 테스트 메서드가 수행되기 전 단 한 번 수행된다.@BeforeClass
@AfterAll현재 클래스의 모든 테스트 메서드가 수행된 후 단 한 번 수행된다.@AfterClass
@Disable테스트 클래스나 메서드를 비활성화 할 때 사용된다.@ignore
  • JUnit Vintage
    JUnit5 Platform 상에서, JUnit4, JUnit3 기반의 테스트들이 구동되는 것을 지원한다.

Mockito

MIT 라이센스에 따라 공개된 Java 용 오픈 소스 테스트 프레임 워크 (JUnit 위에서 돌아간다)
TDD(Test-Driven Development) 또는 BDD(Behavior-Driven Development)를 위해 자동화된 단위테스트`에서 📌테스트 이중 오브젝트 (mock object)를 작성할 수 있다.

  • mock
  • spy
  • injectMocks
  • verify
  • stubbing

Hamcrest

matcher API http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html

소프트 웨어 테스트 작성을 지원하는 프레임워크
JUnit 및 jMock과 같은 단위 테스트 프레임워크에서 사용된다.
2012년 이후 JUnit 4에 포함되었지만 2017년 JUnit5 에서는 생략되었다.
📌JUnit에서 Hamcrest matcher를 사용하려면 assertThat 문 뒤에 하나 이상의 matchers를 사용한다.

ex)
boolean a;
boolean b;

assertThat(a, equalTo(b));
assertThat(a, is(equalTo(b));
assertThat(a, is(b));
profile
🌱 😈💻 🌱

1개의 댓글

comment-user-thumbnail
2022년 9월 20일

This is fantastic, I believe everyone agrees that this knowledge is quite important driving directions mapquest thank you.

답글 달기