본문 바로가기

개발(합니다)/방법론

TDD 학습 및 실습 정리2(JUnit에 대하여)

반응형

TDD 학습 및 실습 정리1에 이어 정리합니다.





JUnit의 기본적인 기능 3가지

 - 테스트 결과가 예상과 강튼지를 판별해주는 단정문(assertions)

 - 여러 테스트에서 공용으로 사용 할 수 있는 테스트 픽스처(test fixture)

 - 테스트 작업을 수행할 수 있게 해주는 테스트 러너(test runner)


JUnit을 비롯하여 단위 테스트를 잘 작성하려면 테스트 픽스처를 알아야합니다.

테스트 픽스처란

테스트를 반복적으로 수행 할 수 있게 도와주고 매번 동일한 결괄르 얻을 수 있는 '기반이 되는 상태나 환경'

일관 된 테스트 실행 환경

'테스트 컨텍스트'라고 부르기도 합니다.

테스트의 작업이나 결과로 만들어진 대상을 통칭합니다.


대표적으로 setUp() 같은 메소드는 테스트 픽스처를 만들고, 정리하는 수행 메소드이며 테스트 픽스처 메소드라고 합니다.



JUnit의 기원

켄트 벡과 에릭 감마가 세 시간 남짓한 시간 동안 비행기 안에서 노트북으로 코딩한 프로그램이 JUnit 테스트 프레임워크의 모태가 되었습니다.


JUint3의 구성요소 : JUit4를 원하시면 안보셔도 됩니다.

1. 테스트 픽스처 메소드

- setUp() : 테스트 메소드 실행 전에 수행 되는 메소드입니다.
- tearDown() : 테스트 메소드 실행 후에 수행 되는 메소드입니다.

 

2. 단정문

- assertEquals : 두 값이 같은지 비교하는 단정문입니다.
- assertSame : 두 객체가 동일한지 주소 값을 비교하는 단정문입니다.
- assertNotSame : 두 객체가 동일하지 않은지 주소 값을 비교하는 단정문입니다.
- assertTrue : 예상 값이 boolean의 참인지 확인하는 단정문입니다.
- assertFalse : 예상 값이 boolean의 거짓인지 확인하는 단정문입니다.
- assertNull : 대상 값이 null인지 확인하는 단정문입니다.
- assertNotNull : 대상 값이 null이 아닌지 확인하는 단정문입니다.
-fail : 해당 테스트 케이스는 실패로 간주하는 단정문입니다.

'~이어야 함' 이라고 보면 헷갈리지 않습니다.

3. 테스트 러너

- junit.swingui.TestRunner.run(테스트클래스.class)
- junit.textui.TestRunner.run(테스트클래스.class)
- junit.awtui.TestRunner.run(테스트클래스.class)

JUnit은 엄연한 독립 된 프레임워크입니다. 
단독으로 사용 할 수 있습니다.
이클립스 4.9버전에서는 테스트 결과 textui 라이브러리만 사용 할 수 있었습니다.

4. 테스트 스위트

- 여러 개의 테스트 케이스를 한번에 수행하고자 할 때
- 테스트 스위트는 테스트 케이스와 다른 테스트 스위트를 포함 시킬 수 있습니다.
- 메소드는 반드시 public static Test suite()여야 합니다.
- 테스트 추가는 suite.addTestSuite(테스트클래스.class)형식을 갖습니다.

현재는 잘 사용하지 않는 기능입니다.
maven이나 ant등의 빌드 도구를 사용해 테스트 합니다.


JUnit4의 특징

1. Java5 어노테이션 지원
2. test라고 시작해야 하는 메소드명 제약 해소
@Test를 붙임
3. 유연해진 픽스처
@Before, @BeforeClass, @After, @AfterClass
4. 예외 테스트
@Test(excepted=NumberFormatException.class)
5. 시간 제한 테스트
@Test(timeout=1000)
6. 테스트 무시
@Ignore("this method isn't working yet")
7. 배열 지원
assertArrayEquals([message], expected, actual);
8. @RunWith(클래스이름.class)
Junit Test 클래스를 실행하기 위한 러너를 명시적으로 지정

9. @SuiteClasses(Class[])

보통 여러 개의 테스트 클래스를 수행할 때 사용

10. 파라미터를 이용한 테스트

@RunoWith(Parameterized.class)

@Parameters


어노테이션의 가장 큰 장점은 코드가 문서화가 됩니다.

@Test를 보고 테스트인지 바로 알 수 있습니다.



테스트 케이스 수행을 세밀하게 조작할 수 있습니다.

TemporaryFolder(임시폴더) : 테스트 메소드 내에서만 사용 가능한 임시 폴더나 임시 파일을 만들어 줍니다.
ExternalResource(외부자원) : 외부 자원을 명시적으로 초기화 합니다.
ErrorCollector(에러 수집기) : 테스트 실패에도 테스트를 중단하지 않고 진행 할 수 있게 도와줍니다.
Verifier(검증자) : 테스트 케이스와는 별개의 조건을 만들어서 확인 할 때 사용합니다.
TestWatchman(테스트 감시자) : 테스트 실행 중간에 사용자가 끼어들 수 있게 도와줍니다.
TestName(테스트 이름) : 테스트 메소드의 이름을 알려줍니다.
Timeout(타임 아웃) : 일괄적인 타임아웃을 설정합니다.
ExpectedException(예상 된 예외) : 테스트 케이스 내에서 예외와 예외 메세지를 직접 확인 할 때 사용합니다.


비교 표현의 확장 : Hamcrest

테스트 표현식을 작성 할 때 문맥을 자연스럽게 만듭니다.
Matcher의 집합체입니다.
대표적으로 assertThat()이 있습니다.
ex)
assertEquals("Test", "test");
assertThat("Test", is("test");
'무엇'을 예상했는데 실제로 '무엇'이 나왔음 으로 해석합니다.


코어

메소드 

설명 

클래스명 

anything 

어떤 오브젝트가 사용되든 일치한다고 판별 

IsAnything 

describedAs

테스트 실패 시에 보여줄 추가적인 메세지를 만들어주는 메세지 데코레이터 

DescribedAs 

equalTo 

두 오브젝트가 동일한지 판별 

IsEqual 

is 

내부적으로 equalTo와 동일하며 가독성 증진용 

Is 


오브젝트

메소드 

설명 

클래스명 

hasToString 

toString 메소드의 값과 치 여부를 판별 

HasToString 

instanceOf

typeCompatibleWith

동일 인스턴스인지 타입 비교(instance of),

동일하거나 상위 클래스, 인터페이스인지 판별 

IsInstanceOf

IscompatibleType 

notNullValue

nullValue 

Null인지, 아닌지 판별 

IsNull 

sameInstance 

Object가 완전히 동일한지 비교,

equals 비교가 아닌 ==(주소 비교)로 비교하는것과 동일 

IsSame 


논리

메소드 

설명 

클래스명 

allOf 

비교하는 두 오브젝트가 각각 여러 개의 다른 오브젝트를 포함하고 있을 경우에 동일 여부 판단 

AllOf

anyOf 

하나라도 일치하면 true 

AnyOf 

not 

서로 같지 않음 

IsNot 


빈즈

메소드 

설명 

클래스명 

hasProperty

Java 빈즈 프로퍼티 테스트 

HasProperty 


컬렉션

메소드 

설명 

클래스명 

array 

두 배열 내의 요소가 모두 일치하는지 판별 

IsArray 

hasEntry, hasKey, hasValue 

Map 요소에 대한 포함 여부 판단 

IsMapContaining 

hasItem, hasItems 

특징 요소들을 포함하고 있는지 여부 판단 

IsCollectionContaining 

hasItemInArray 

배열 내에 찾는 대상이 들어 있는지 여부를 판별 

IsArrayContaining 


숫자

메소드 

설명 

클래스명 

closeTo 

부동 소수점 값에 대한 근사값 내 일치 여부 판별, 값과 오차를 인자로 갖음 

IsCloseTo 

greaterThan 

greaterThanOrEqualTo

값 비교, >, >= 

OrderingComparison 

lessThan

lessThanEqualTo

값 비교, <, <= 

OrderingComparison


텍스트

메소드 

설명 

클래스명 

containsString 

문자열이 포함되어 있는지 여부 

StringContains 

startsWith 

특정 문자열로 시작 

StringStartsWith 

endWith 

특정 문자열로 종료 

StringEndWith 

eqaulToIgnoringCase 

대소문자 구분하지 않고 문자열 비교 

IsEqualIgnoringCase 

equalToIgnoringWhiteSpace 

문자열 사이의 공백 여부를 구분하지 않고 비교 

IsEqualIgnoringWhiteSpace 






반응형