-
TDD 실천법과 도구 - JUnit과 Hamcrest ( + Junit 5 )Knowledge/TDD 2019. 10. 16. 00:20반응형
이 포스팅은 아래 링크에서 확인할 수 있는 "TDD 실천법과 도구" 책을 읽고 정리한 내용입니다.
- 테스트 픽스처의 개념
테스트를 반복적으로 수행할 수 있게 도와주고 매번 동일한 결과를 얻을 수 있게 도와주는 '기반이 되는 상태나 환경'을 의미한다. 일관된 테스트 실행환경이라고도 하며, 때로는 테스트 컨텍스트라 부르기도 한다.
테스트 케이스에서 사용할 객체의 인스턴스를 만든다든가, 데이터베이스와 연동할 수 있는 참조를 선언한다든가, 파일이나 네트워크 등의 자원을 만들어 지정하다든가 하는 등의 작업 혹은 그 작업의 결과로 만들어진 대상을 통칭한다. 이런 작업을 수행하는 메소드를 테스트 픽스처 메소드라고 한다
- Junit 3
- 단정문
'무언가를 딱 잘라 한마디로 판단하는 짧은 문장'을 의미한다. 일반적으로 '단언하다'는 뜻의 assert 라는 단어로 시작하며 '두 값 비교, 참/거짓, null 여부' 등을 판별한다. 종류로는 아래와 같은 것들이 있다.
assertEquals([message], expected, actual) : 두 값이 같은지 비교한다. float나 double 형의 경우 뒤에 소수점 비교가 정확히 되지 않는 한계를 해결하기 위해 오차범위를 입력할 수도 있고 기대값과 실제 값의 차이가 그 오차범위 이내면 테스트가 통과된 것으로 판단하다
assertSame([message], expected, actual) : 두 객체가 정말 동일한 객체인지 주소값으로 비교한다
assertNotSame([message], expected, actual) : 두 객체의 주소값이 다르면 테스트를 통과한다
assassertTrue([message], expected) , assertFalse([message], expected)
예상값의 참/거짓을 판별하는 단정문이다. boolean 타입 메소드를 이용할 경우나, 부등호 비교, 범위 비교 등을 판단할 때 사용한다.
assertNull([message], expected), assertNotNull([message], expected)
대상 값의 null 여부를 판단하는 단정문이다
fail([message]) : 이 메소드가 호출되면 해당 테스트 케이스는 즉시 실패한다. 단정문 작성을 누락하고 테스트를 수행하면 녹색 막대가 나와버리는데 이런 상황을 방지하기 위해 사용할 때 유용하다
- 테스트 스위트
여러 개의 테스트 케이스를 함께 수행할 때 사용하지만 현재는 잘 사용하지 않는다
- Junit 4
- @Test
테스트 케이스에 해당하는 메소드로 지정하기 위해 사용하는 애노테이션. Junit 3의 경우 애노테이션이 제공되지 않아 테스트 케이스에 해당하는 메소드 이름은 모두 test 로 시작해야하는 한계가 있었다
- @BeforeClass, @AfterClass, @Before, @After
넷 모두 테스트 픽스처 메소드다. @BeforeClass와 @AfterClass는 하나의 테스트 클래스내에서 가장 처음 혹은 가장 나중에 단 한번만 실행되고 @Before와 @After는 테스트 케이스 메소드 실행전 후에 실행된다
- 에외처리 테스트
JUnit 4에서는 @Test 애노테이션의 속성 중 expected를 이용해 예외처리를 테스트한다. expected의 값으로 예외 클래스를 지정했을 때, 테스트 메소드 내에서 해당 예외가 발생하면 통과, 발생하지 않는다면 실패로 간주한다
- 시간 제한 테스트
@Test의 속성으로 timeout을 지정하고, 그 값으로 밀리초 단위의 시간을 정해준 후 해당 시간 내에 테스트 메소드가 수행완료되지 않으면 실패한 테스트 케이스로 간주한다.
- 테스트 무시
@Ignore가 붙은 테스트 메소드는 해당 애노테이션을 지우기 전까진 수행하지 않는다.
- 배열 지원
assertArrayEquals(names, anotherNames); 으로 배열을 비교할 수 있다. 단 배열안의 값 집합은 동일해도 순서가 다르면 테스트 결관느 실패로 나온다
- @Runwith
Junit 테스트 메소드를 실행하면 내부적으로 BlockJUnit4ClassRunner라는 테스트 러너 클래스가 실행되고, 이클립스는 그 결과를 해석해서 우리에게 보기 편한 화면으로 보여준다. @RunWith 애노테이션은 이 러너 클래스를 지정된 클래스로 바꿀 수 있게 해주는 애노테이션이다. 이를 테면 @RunWith 애노테이션을 선언하고 Spring 에서 제공하는 SpringJUnit4ClassRunner.class를 지정하면 @Repeat, @ProfileValueSourceConfiguration, @IfProfileValue 등 스프링에서 자체적으로 만들어놓은 추가적인 테스트 기능을 이용할 수 있게 된다
- @SuiteClasses
여러 개의 테스트 클래스를 일괄적으로 수행할 때 이 애노테이션을 이용한다
- 파라미터화된 테스트
하나의 메소드에 대해 다양한 테스트 값을 한꺼번에 실행시키고자 할 때 사용한다. 특정 기준에 따라 테스트 해야 하는 값이 달라지면 테스트 메소드가 많아지거나 구문이 장황해질 수 있는데, 파라미터화된 테스트를 사용 하면 테스트 케이스를 효율적으로 작성할 수 있다
- Rule
- Theory
테스트 데이터와 상관없이 작성 대상 메소드를 항상 유지해야 하는 논리적인 규칙을 표현할 때 사용한다.'
- Hamcrest
Hamcrest 는 단순히 몇 개의 assertXXX 시리즈로 동작하던 Junit의 assertion 을 좀 더 확장해서 읽기 편하기 만들어주던 유창한 비교 표현식(Fluent Assertion) library 였다. 요즘엔 이런 라이브러리로 구글의 Truth ( http://google.github.io/truth/ ) 도 많이 쓴다.
- Junit 4 vs Junit 5
- Annotations
- Assert
이 장의 실습 코드는 아래 링크에서 확인 가능합니다
반응형'Knowledge > TDD' 카테고리의 다른 글
TDD 실천법과 도구 - TDD ( Test Driven Development ) (0) 2019.10.15