오늘따라 눈을 뜨기가 힘들었다.

오랜만에 잠에서 이겨내지 못하는 아침이었다…
정말 한결같기는 진짜 어렵다는 생각도 들고
참 나약하구나라는 생각도 든다.

그래도 오늘은 비교적 쉬운 주제이기 때문에
열심히 공부해보자 !!


어제는 트랜잭션에 대해 알아보았다.
기본적으로 선언형 방식을 이용해보았다. 속성에 대해서는
깊은 공부가 이루어지지는 않았다.
트랜잭션의 기본 동작원리와 적용시 어떻게 처리가되는지?
정도 확인을 해보았다.

오늘은 비교적 난이도가 쉬운 주제인 Testing에 대해 공부해볼 예정이다.

TEST

테스트는 여러가지 분야에서 많이 들어봤을 것 같다.
무었이든지 출시하기전에는 검증과 테스트가 거쳐진다.

프로그램에서의 테스트는 내가 작성한 로직에 대한
검증이고, 여러가지 예외상황을 가정해 테스트를 진행해볼 수 있다.

Unit Test

단위테스트라고 직역할 수 있다.
단위 테스트는 이름에서 오듯이 단위를 정해 테스트를 진행한는 것이다.
비지니스 로직에서 사용하는 클래스들이 독립적으로 테스트하기
가장 좋은 대상이기 때문에 단위테스트라고 부르는 경우가 많다.

우리가 작성한 메서드 단위로 테스트를 한다고 생각하면 될 것 같다.
그 외에 전체단위로 보았을 때 여러 테스트가 있다.

  1. 기능 테스트 -> 클라이언트, 애플리케이션, DB 까지 테스트하는 과정
  2. 통합 테스트 -> 애플리케이션, DB까지 테스트하는 과정
  3. 슬라이드 테스트 -> 애플리케이션 특정 계층을 쪼개어서 하는 테스트


Test Express

Given-When-Then 방식으로 표현을 한다.
BDD(Behavior Driven Development)라는 테스트 방식의 용어이다.

Given
-> 테스트를 위한 준비과정을 명시
-> 테스트에 필요한 전제 조건들이 포함된다.

When
-> 테스트할 동작을 지정한다.
-> 테스트할 메서드 호출을 하는 부분이다.

Then
-> 테스트의 결과를 검증하는 영영이다.
-> Assertion과 같은 클래스로 검증을하는 부분이다.


JUnit

우리는 Java언어로 만들어진 애플리케이션을 테스트하기위해서
오픈 소스 테스트 프레임워크인 JUnit을 사용하게 된다.
(Spring Boot의 Default 테스트 프레임워크가 Junit이다)

image

위 사진과 같이 스프링 프로젝트를 만들 경우
test 패키지가 생긴다 안에 패키지를 만들어 다양한
테스트 케이스를 만들어 로직을 검증해볼 수 있다.

기본적인 사용방법은 간단하다.

클래스를 만들어
매서드에 @Test 어노테이션을 붙여 테스트 해볼 수 있다.

public class JunitTest {
    
    @Test
    @DisplayName("Test 1")
    public void assertionTest(){
        ...
    }
}

어노테이션에 대해 공부한 것들을 적어본다

@BeforeEach
-> 테스트 실행중 먼저 실행되어지는 메서드에 붙여준다.
-> 각테스트 매서드가 실행되기전 실행한다.

@BeforeAll
-> 테스트 실행중 딱한번만 실행되어지는 메서드에 붙여준다.
-> Test 클래스 실행전 한번만 실행된다.
-> 그러므로 정적 메서드여야 한다 (static)

@AfterEach
-> 테스트 실행중 실행완료후 실행되어지는 메서드에 붙여준다.
-> 각테스트 메서드가 실행되고난후 실행한다.

@AfterAll
-> 위에 내용과 같으니 참조

@DisplayName(“”)
-> 메서드에 붙여주면, 해당 어노테이션의 이름을 커스터마이징 할 수 있다.

@SpringBootTest
-> 테스트 클래스에 붙여준다
-> 테스트실행시, 스프링을 띄운다음 스프링을 사용할 수 있게된다.
-> 즉, 애플리케이션에서 컨테이너에 담아둔 빈들을 주입할 수 있다.

@TestConfiguration
-> 테스트 안에서 내부 클래스를 만들어서 사용하면서 이 어노태이션을 붙이면
스프링 부트가 자동으로 만들어주는 빈들에 추가로 필요한 스프링 빈들을 등록하고 테스트를 수행할 수 있다.

@AutoConfigureMockMvc
-> MockMvc 기능을 사용하기위한 애노테이션
-> Controller 슬라이스 테스트를 진행한다고 가정하면
Controller 테스트를 위한 애플리케이션의 자동 구성 작업을 해준다.
-> 주입받은 객체는 .perform()을 이용해 http매세더 요청가능


사용 방법을 알았으니 이제 검증하는 방법도 알아야한다.
검증할때 사용하는 클래스들이 여러가지 있다.

1). Assertions 클래스
-> assertJ 패키지의 클래스를 가져와야 사용가능
-> .assertThat(); 같은 매서드로 검증해주는 기능들을 제공해줌

.assertThat();
-> 다양한 검증 메서드들을 제공

.assertThatThrownBy();
-> assertThat과 동일하게 메서드를 제공하지만 예외를 확인할 수 있다.

.isTure();
-> 앞의 내용이 참이면 테스트 성공

.isFalse();
-> 앞의 내용이 거짓이면 테스트 실패

.isEqualTo
-> 값이 동일하면 테스트 성공

2.) Assertions 클래스
-> jupiter 패키지의 클래스를 가져와야 사용가능

.assertEquals();
-> 기대값이 실제값과 같은지 비교
-> 좌측이 기대값, 우측이 실제값
-> ex) assertEquals(“a”,”a”);

.assertNotNull();
-> Null값이 아니면 검증 통과, 아니면 Fail
-> ex) assertNotNull(변수, 매세지);

.assertThrows();
-> 기대하는 Exception타입과 내용을 입력한다.
-> 기대하는값이 Exception 타입과 맞지 않을 경우에는 테스트 실패
반대로 타입과 같을경우에는 성공
-> ex) assertThrows(NullPointerException.class, ()-> 호출메서드));

2). Assumption 클래스
.assumeTrue();
-> 특정 조건에서 선택적인 테스트가 필요할때 사용

4). MatcherAssert 클래스
-> JUnit 기반의 Assertion 프레임워크이다.
-> 자연스러운 문장으로 이어지는 특성이있어 가독성 향상이 크다.
-> hamcrest 패키지에 있음

.assertThat();
-> 다양한 검증 메서드를 제공해줌
-> ex) .assertThat(a, is(equalTo(null)));
.is();
.equalTo();
.notNullValue();


이 외에도 JUnit 기반으로 만들어진 프레임워크에서
사용할 수 있는 클래스와 메서드들이 많이 있고
이 부분은 지속적으로 테스트프로그램 작성하면서 습관을 들이면서
지식의 범위를 늘려야할 것 같다.



오늘의 커피량: ☕️ ☕️
오늘의 점심: 카레,밥