본문 바로가기

JUnit

JUnit

  1. 단위테스트
    간단한 단위 테스트라면 굳이 JUnit을 활용하지 않더라도 어렵지 않게 작성할 수 있다, 하지만 새로운 테스트들이 추가되고 복잡해지면서, 테스트를 작성하고 관리하기가 점점 어려워진다, 
    JUnit은 바로 이런 어려움을 완화해주는 단위 테스트 프레임 워크다
    1. 단위테스트는 다른 모든 단위 테스트들과 독립적으로 실행되어야 한다
    2. 프레임워크는 테스트 각각의 오류를 식별하고 보고해야 한다
    3. 어떤 테스트를 실행할지 선택하기 쉬워야한다.
  2. JUnit 설계목표
    1. 유용한 테스를 작성하는 데 보탬이 돠어야 한다
    2. 시간이 지나도 가치가 변치 않는 테스트를 작성하는 데 보탬이 되어야한다.
    3. 코드 재사용을 통해 테스르 작성 비용을 낮추는데 보탬이 되어야 한다
  3. JUnit테스트를 쉽게 작성하고 실행하도록 도와주는 기능
    1. 부작용 예방을 위한 테스트별 독립 테스트 클래스 인스턴스와 클래스 로더
    2. 자원 초기화와 회수를 위한 JUnit 어노테이션 : @Before, @BeforeClass, @After, @AfterClass
    3. 테스트 결과 확인을 도와주는 다양한 assert 메소드
    4. 유명 툴과 IDE의 통합 : Ant, Maven, Eclipse, NewBeans, InteliJ, JBuilder 등
  4.  
  5. @BeforeEach : 각각 테스트 메소드가 실행되기전에 실행되어야 하는 메소드를 명시해준다. @Test , @RepeatedTest , @ParameterizedTest , @TestFactory 가 붙은 테스트 메소드가 실행하기 전에 실행된다. JUnit4의 @Before 와 같은 역할을 한다. 개인적으로 테스트 하기전에 필요한 목업 데이터를 미리 세팅해주기 위해 주로 사용한다.
  6. @AfterEach : @Test , @RepeatedTest , @ParameterizedTest , @TestFactory 가 붙은 테스트 메소드가 실행되고 난 후 실행된다. JUnit4의 @After 어노테이션과 같은 역할을 한다.
  7. @BeforeAll : @BeforeEach 는 각 테스트 메소드 마다 실행되지만, 이 어노테이션은 테스트가 시작하기 전 딱 한 번만 실행 된다.
  8. @AfterAll : 이것도 위와 같다. 테스트가 완전히 끝난 후 딱 한 번만 실행 된다.
  9. @Nested : test 클래스안에 Nested 테스트 클래스를 작성할 때 사용되며, static이 아닌 중첩클래스, 즉 Inner 클래스여야만 한다. 테스트 인스턴스 라이플사이클이 per-class 로 설정되어 있지 않다면 @BeforeAll , @AfterAll 가 동작안하니 주의하자. 테스트 인스턴스 라이플사이클은 밑의 내용에서 한번 더 언급 된다.
  10. @Tag : 테스트를 필터링할 때 사용한다. 클래스또는 메소드레벨에 사용한다.
  11. @Disabled : 테스트 클래스나, 메소드의 테스트를 비활성화 한다. JUnit4의 @Ignore와 같다.
  12. @Timeout : 주어진 시간안에 테스트가 끝나지 않으면 실패한다.
  13. @ExtendWith : extension을 등록한다. 이 어노테이션은 상속이 된다. 확장팩이라고 생각하면 될 것 같다.
  14. @RegisterExtension : 필드를 통해 extension을 등록한다. 이런 필드는 private이 아니라면 상속된다.
  15. @TempDir : 필드 주입이나 파라미터 주입을 통해 임시적인 디렉토리를 제공할 때 사용한다.
     

    assert 메서드 사용 목적
    assertArrayEqauls("message", A, B) 배열 A와 B가 일치함을 확인한다.
    assertEquals("message", A, B) 객체 A와 B가 일치함을 확인한다.
    A.equals(B) 를 수행한다.
    assertSame("message", A, B) 객체 A, B가 같은 객체임을 확인한다.
    assertEquals는 equals()로 검사한다.
    assertSame은 ==으로 검사한다. (하나의 객체인지를 검사)
    assertTrue("message", A) A가 참인지 확인한다.
    assertNotNull("message", A) A가 null이 아님을 확인한다. 

    JUnit 개념 역할
    Assert 테스트 하려는 조건을 명시한다.
    assert 메서드는 조건을 만족시키면 아무 일도 없음.
    조건을 만족시키지 못하면 예외를 발생시킨다. 
    Test 메서드 @Test 어노테이션을 가진 메서드. 
    JUnit은 테스트 메서드를 실행할 때 마다 테스트 클래스를 생성한다.
    JUnit은 테스트 클래스를 생성하고, 테스트 메서드를 실행한다.
    Test 클래스 @Test 메서드를 포함한 클래스다.
    Suite 여러 테스트 클래스를 하나로 묶는 객체다.
    개발자가 지정하지 않으면 기본적인 스위트가 제공된다. (만들지 않아도 됨) 
    Runner 러너는 테스트를 실행시킨다.
    러너마다 다른 형태의 테스트를 수행한다.
  16. 파라미터화 테스트
  17. 파라미터화 테스트 러너는 하나의 테스트를 여러번 반복 실행하는 기능을 제공한다. 테스트에 사용되는 각종 데이터를 파라미터로 뽑아내고, 뽑아낸 파라미터의 값을 매번 바꿔가며 테스트를 호출한다
  18. JUnit 테스트 러너
    코딩-수행-테스트-코딩 순서 혹은 테스트 주도 방식을 선호한다면 테스트-코드-수행-테스트 순서도 좋다, 신속한 애플리케이션 제작과 실행을 위하 IDE와 컴파일러가 존재하듯 JUnit은 테스트의 제작과 실행을 거들어준다

    Runner 용도
    org.junit.internal.runners.JUnit38ClassRunner JUnit 하위 버전과 호환 목적으로 제공 되는 러너. 
    JUnit 3.8 테스트 케이스 전용이다.
    org.junit.runners.JUnit4 JUnit 4 스타일의 테스트 케이스를 실행한다.
    org.junit.runners.Parameterized 같은 테스트 케이스를 다른 입력 값을 사용해 반복 수행한다.
    org.juni.runners.Suite 복수의 테스트를 묶을 수 있는 집합이다.
    테스트 클래스 내의 모든 @Test 메서드를 찾아 실행하는 러너이기도 하다.
    1. 별다른 표식이 없는 테스느 클래스는 기본 테스트 러너로 실행된다. 특정 테스트 러너를 사용하고자 한다면  @RunWith 어노테이션을 이용해 원하는 테스트 러너의 클래스를 지정해주면 된다.
    2. JUnitCore 퍼사드
      1. 최대한 빠르고 쉽게 테스트 하고픈 우리 욕구를 해고시키고자 JUnit은 어떠한 테스트 러너와도 잘 맞는 퍼사드를 제공한다. 이 퍼사다는 테스트 수행은 물론, 결과 취합과 통계까지 제공하는 종합 선물세트다.(→ 퍼사드 패턴)
    3. 스위트를 이용한 테스트 조직하기
      1. 스위트는 테스트를 담는 그릇으로, 여러 테스트를 묶어 한번에 실행 할 목적으로 사용된다
      2. JUnit 스위트는 하나 이상의 테스트 케이스를 실행 하도록 설계되었다.
      3. 메서드를 추가하고 @Test 표식만 달아준다면, 기본 스위트가 알아서 추가된 매서드를 포함시킨다
      4. 두개이상의 테스트 클래스도 담을 수도 있다
        1. @RunWith(value=org.junit,.runners.Suite.class)
          @SuiteClasses(value={FolderConfigurationTest.class,FileConfiguretaionTest.class})
    4. 테스트 코드 작성
      1. 정해진 상태(객체 생성, 자원획득)로 테스트 환경을 초기화 한다, 테스트 이전의 상태는 페스트 픽스쳐라 한다
      2. 테스트 대상 메서드를 호출한다
      3. 결과를 확인한다. 보통 하나혹은 그 이상의 assert 메서드를 이용한다 
    5. Hamcrest
      1. 사용자 정의 assertion Matcher 작성(Hamcrest는 'Matchers'의 anagram-동일한 알파벳을 재배열하여 만들어낸 문장이나 단어-)을 지원하여 검증 규칙을 선언적으로 정의할 수 있다.
        이 Matcher는 JUnit 및 jMock과 같은 단위 테스트 프레임워크에서 사용된다.
    6. 모범사례 
      1. 한번에 하나의 객체만 테스트하라
      2. 테스트 메서드에 의미 있는 이름을 부여하라
      3. assert 호출 시에는 실패 원인을 기술하라
      4. 하나의 @Test 메서드에서는 하나의 테스트만 수행하라
      5. 실패할 가능성이 있는 모든것을 테스트 하라
      6. 예외 테스트도 읽기 쉽게 만들어라
      7. 테스트 코드를 통해 코드를 개선하라
      8. 테스트를 건더뛸때는 반드시 그 이유를 명시하라

https://ojt90902.tistory.com/1338

https://donghyeon.dev/junit/2021/04/11/JUnit5-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/

https://velog.io/@choidongkuen/Junit-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-e0w6tlvp

https://junit.org/junit4/javadoc/4.8/org/junit/Assert.html

https://ojt90902.tistory.com/1338

https://donghyeon.dev/junit/2021/04/11/JUnit5-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/

https://velog.io/@choidongkuen/Junit-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-e0w6tlvp

https://junit.org/junit4/javadoc/4.8/org/junit/Assert.html

 

 

디자인패턴

1. 퍼사드 패턴

2. 제어구조 역전

 

참조

https://ojt90902.tistory.com/1338

https://donghyeon.dev/junit/2021/04/11/JUnit5-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C/

https://velog.io/@choidongkuen/Junit-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-e0w6tlvp

https://junit.org/junit4/javadoc/4.8/org/junit/Assert.html

https://velog.io/@hanblueblue/spring-boot-%EC%9C%A0%EB%8B%9B-%ED%85%8C%EC%8A%A4%ED%8A%B8-4.Hamcrest