테스트 코드 하나를 작성하는데 몇 시간을 들인 경험을 했다.
서비스 로직 만큼 중요한 것이 테스트 코드를 작성하는 것이라고는 하나, 실제 로직을 작성하는 것보다 테스트 코드를 작성하는데 더 많은 시간이 드는 것(...)은 배보다 배꼽이 큰 격 아닌가?
테스트 코드 작성 방식을 익히고, 같은 부분을 또다시 삽질하지 않도록 기록으로 남긴다.
👉 간단한 예시를 먼저 보자.
다음과 같은 맛집 추천 프로그램을 작성했다.
여기서 Unit Test는 save, get, add라는 단일 메소드가 잘 수행되는지, 혹은 엔티티를 가공하는 단일 메소드가 잘 수행되는지 각각의 메소드를 별개로 테스트 하는 작업이며, Integration Test는 save후 get하여 add하는 일련의 과정, 즉 여러 메소드의 복합적 수행에 대해 테스트 하는 작업이다.
전체 코드 중 작은 부분을 테스트한다. 즉, 함수 하나하나 개별로 테스트 코드로 작성한다.
같은 input에 대해 항상 같은 output을 보장함을 판단하는 테스트이다.
네트워크나 데이터베이스같은 외부 리소스가 포함되면 유닛 테스트라고 할 수 없으므로 Mock객체를 사용하게 된다.
시스템들이 올바르게 상호작용하여 작동하는 것을 테스트한다.
실제 외부 리소스와 통신하도록 작성해야하므로, 분리된 시스템끼리 잘 통신하고 있는지 증명하고자 할 때도 사용된다.
👉Unit Test : 어떤 부분에 문제가 있고 고칠 부분이 어디인지 명확하게 해준다.
👉Integration Test : 이벤트 흐름에 이상이 없는지 테스팅하는데 좋다.
ref. https://junit.org/junit5/
ref. https://kimseunghyun76.tistory.com/432
자바 프로그래밍 언어용 유닛 테스트 프레임워크
테스트 주도 개발(TDD) 면에서 중요하며 SUnit과 함께 시작된 XUnit이라는 이름의 유닛 테스트 프레임워크 계열의 하나이다.
📌JUnit4가 단일 Jar였으나, JUnit5는 JUnit Platform, JUnit Jupiter, JUnit Vintage 모듈로 구성돼있다.
Annotaion | Description | JUnit4 |
---|---|---|
@TestFactory | 동적 테스트들을 위한 테스트 팩토리인 메서드를 나타낸다. | |
@DisplayName | 테스트 클래스나 테스트 메서드를 위한 커스텀 디스플레이 네임을 정의한다. | |
@Nested | nested, non-static 테스트 클래스임을 나타낸다. | |
@Tag | 필터링 테스트들을 위한 태그들을 정의한다. 테스트를 그룹핑하고 필터링한다. | @Categories |
@ExtendWith | 커스텀 Extensions을 등록할 때 사용된다. | |
@BeforeEach | 각각의 테스트 메서드 실행 직전에 수행된다. | @Before |
@AfterEach | 각각의 테스트 메서드 실행 직후에 수행된다. | @After |
@BeforeAll | 현재 클래스의 모든 테스트 메서드가 수행되기 전 단 한 번 수행된다. | @BeforeClass |
@AfterAll | 현재 클래스의 모든 테스트 메서드가 수행된 후 단 한 번 수행된다. | @AfterClass |
@Disable | 테스트 클래스나 메서드를 비활성화 할 때 사용된다. | @ignore |
MIT 라이센스에 따라 공개된 Java 용 오픈 소스 테스트 프레임 워크 (JUnit 위에서 돌아간다)
TDD(Test-Driven Development) 또는 BDD(Behavior-Driven Development)를 위해 자동화된 단위테스트`에서 📌테스트 이중 오브젝트 (mock object)를 작성할 수 있다.
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));
This is fantastic, I believe everyone agrees that this knowledge is quite important driving directions mapquest thank you.