///////
Search
🤴

전승환

TDD(Test Driven Development)

TDD는 개발을 할 때 테스트에 주도권을 준다는 의미이다. 그래서 개발보다 테스트를 먼저 작성한 후에 테스트를 통과하는 코드를 작성하는 방식을 사용한다.
테스트는 다양한 종류로 나눌 수 있다. 크게 나누면 아래의 5가지가 있다.
1.
단위 테스트: 작은 프로그램이나 클래스, 또는 루틴을 실행하는 것으로, 시스템의 완성과는 별개의 테스트이다.
2.
컴포넌트 테스트: 단위 테스트 때보다는 좀 더 크지만 소형인 프로그램을 테스트할 때 실행한다. 여러 개발자가 참여하는 클래스나 패키지가 해당되며, 아직 시스템의 완성과는 별개이다.
3.
통합 테스트: 여러 개발자가 만든 클래스들을 결합한 프로그램을 실행하는 단계이다. 테스트해야 하는 클래스가 두 개 이상이 될 때부터 시작해서 시스템 완성 때까지 진행한다.
4.
회귀 테스트: 이전에 통과한 테스트 집합을 이용해 결함을 찾는 방식이다. 이전에 실행했던 테스트 케이스를 반복하는 것을 말한다.
5.
시스템 테스트: 전체 소프트웨어 및 하드웨어 시스템과 통합된 최종적인 환경에서 실행하는 테스트이며, 저수준에서는 할 수 없는 보안, 성능, 자원 손실, 시간 문제 등을 테스트한다.
이 중 단위 테스트를 작성하는 방법에 대해 알아보자.
다음 코드는 버블 정렬을 향상시킨 코드이다. 배열의 길이만큼 반복되면서 인접한 두 수를 비교하는 중간에 이미 정렬이 되어버리면 그대로 멈춘 뒤 몇 번째 반복 차례에서 멈추었는지를 반환한다.
코드 보기
이 코드를 테스트 하기 위해서는 우선 반복이 몇 번째에 멈추는지 알고 있어야 한다. 예를 들어, 정수 배열 {10,50,30,20,40} 는 2번째 반복에서 정렬이 끝난다. 그러므로 메서드는 2를 반환해야 한다. 이에 대한 테스트 코드를 짜는 방법은 다음과 같다.
테스트 코드 생성하고 작성하는 법

테스트 코드 작성할 때 알아야 할 것들

우선 테스트 클래스에 반드시 들어가는 annotation은 다음과 같다.
@Test : 현재 메소드가 일반적인 메소드가 아닌 테스트를 위한 메소드임을 나타낸다.
@DisplayName(String message) 현재 메소드가 무엇을 위한 테스트인지를 나타내는 문자열을 명시한다.
그리고 이렇게 작성된 메소드 안에서는 몇몇의 static 메소드를 사용하는데, 대표적으로 Assertions 클래스에서 호출되는 메소드들은 다음과 같다.
assertTrue, assertFalse (boolean condition, String message) : 각각 주어진 condition이 리턴하는 값이 true인지 아니면 false인지를 에러 시의 message 를 통해 알려준다.
assertNull, assertNotNull (Object object, String message) : 주어진 객체가 null 인지 아닌지를 에러 시의 message를 통해 알려준다.
assertEquals(A, B) : 주어진 두 개의 값이 (타입 상관 없이) 동일한지 여부를 알려준다. A가 expected , 즉 기댓값이고, B가 actual , 즉 실제 메서드로부터 반환된 값이다.
assertAll(Executable executable...) : 많은 테스트 메서드들을 한번에 매개 변수로 받아서 모두 실행할 수 있다. 람다식이 사용되는데, 예를 들어, 다음과 같이 할 수 있다.
@Test @DisplayName("테스트 케이스") void test() { Assertions.assertAll( () -> assertFalse(true, "Exception!"), () -> { ImprovedBubbleSort testObj = null; assertNotNull(testObj, "Object is null!"); } ); }
Java
복사