ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TDD 실천법과 도구 - JUnit과 Hamcrest ( + Junit 5 )
    Knowledge/TDD 2019. 10. 16. 00:20
    반응형

    이 포스팅은 아래 링크에서 확인할 수 있는 "TDD 실천법과 도구" 책을 읽고 정리한 내용입니다.

     

     

    "TDD 실천법과 도구" 책 전체를 PDF 공개합니다.

    2010년 6월에 출간되었던 "TDD 실천법과 도구" 책 전체를 PDF로 공개합니다. 책소개: http://naver.me/GaYZCDjD Updated --- - [1장 - 테스트주도개발 Test Driven Development](https://repo.yona.io/doortts/blog/issue/2) - 18.07.18 - [2장 - doortts/blog

    repo.yona.io

    • 테스트 픽스처의 개념

    테스트를 반복적으로 수행할 수 있게 도와주고 매번 동일한 결과를 얻을 수 있게 도와주는 '기반이 되는 상태나 환경'을 의미한다. 일관된 테스트 실행환경이라고도 하며, 때로는 테스트 컨텍스트라 부르기도 한다.

     

    테스트 케이스에서 사용할 객체의 인스턴스를 만든다든가, 데이터베이스와 연동할 수 있는 참조를 선언한다든가, 파일이나 네트워크 등의 자원을 만들어 지정하다든가 하는 등의 작업 혹은 그 작업의 결과로 만들어진 대상을 통칭한다. 이런 작업을 수행하는 메소드를 테스트 픽스처 메소드라고 한다

     

    • 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

     

    이 장의 실습 코드는 아래 링크에서 확인 가능합니다

     

     

    nomelancholy/TDD

    Contribute to nomelancholy/TDD development by creating an account on GitHub.

    github.com

     

    반응형

    'Knowledge > TDD' 카테고리의 다른 글

    TDD 실천법과 도구 - TDD ( Test Driven Development )  (0) 2019.10.15

    댓글

Designed by Tistory.