⏰ 2024. 06. 20 목

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. 프로그래밍 개발 순서
  2. 단위 테스트
  3. 통합 테스트
  4. JUnit5 라이브러리 다루기

테스트 - 테스트 코드

프로그래밍 개발 순서

  1. Development : 개발
  2. Unit Test (단위 테스트) : 개발자 테스트
  3. QA Testing : 블랙박스 테스팅/ 주로 QA 팀이 Production 환경과 유사한 환경(Stage)에서 테스팅
  4. Production : 실 서비스 운영 환경
  • 테스트 코드를 작성하여 프로그램의 버그를 사전에 발견하여 기하급수적인 비용의 증가가능성을 사전에 방지할 수 있다.

  • 버그가 발견되는 시점이 늦어질수록 해결하기 위한 비용이 기하급수적으로 커진다.

단위 테스트

  • 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법이다.

  • 하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트할 수 있다.

  • 단위 테스트는 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘못되었는지를 빠르고 정확하게 확인할 수 있다는 장점이 있다.

  • 하나의 모듈이나 클래스에 대한 테스트이기 때문에 모듈 간의 상호 작용은 검증할 수 없다.

통합 테스트

  • 여러 개의 단위 테스트를 하나의 통합된 테스트로 검사하는 테스트 기법이다.

  • 두 개 이상의 모듈이 연결된 상태를 테스트할 수 있다.

  • 모듈 간의 연결에서 발생하는 문제를 검증이 가능하다.

  • 단위 테스트 시에는 Spring은 동작하지 않고, 통합 테스트 시에는 @SpringBootTest를 통해 스프링을 동작시킬 수 있다.

  • @SpringBootTest : 스프링이 동작되도록 해주는 애너테이션

  • 통합 테스트 수행 시 스프링이 동작하기 때문에 Spring IoC/DI 기능을 사용할 수 있고, Repository를 사용해 DB CRUD가 가능하다.

JUnit5 라이브러리 다루기

Before - After

  • @BeforeEach : 각각의 테스트 코드가 실행되지 전에 수행되는 메서드를 만든다.

  • @AfterEach : 각각의 테스트 코드가 실행된 후에 수행되는 메서드를 만든다.

  • @BeforeAll : 모든 테스트 코드가 수행되기 전에 최초로 수행되는 메서드를 만들고, 이 메서드는 항상 static 이여야 한다.

  • @AfterAll : 모든 테스트 코드가 수행된 후 마지막으로 수행되는 메서드를 만들고, 이 메서드는 항상 static 이여야 한다.

테스트 꾸미기

  • @DisplayName : 테스트의 내용을 한 눈에 알아볼 수 있게 네이밍할 수 있어 테스트의 수행 내용들을 빠르게 파악할 수 있다.

  • @Nested : 주제 별로 테스트를 그룹화한다. Class 안에서 Class로 여러 메서드를 묶는다.

  • @Order : 테스트를 메서드 단위로 순서를 지정하고 싶을 때, @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 애너테이션을 테스트 클래스 위에 설정한다. 이후 원하는 메서드에 @Order(n) 을 추가하고 n 위치에 원하는 순서를 입력한다.

테스트 반복

  • @RepeatedTest : 위 애너테이션을 사용하여 테스트 메서드를 반복할 수 있고, name 옵션을 사용하여 네이밍할 수 있다. RepetitionInfo 값을 파라미터로 받아서 현재 반복 횟수와 총 횟수 값을 확인할 수 있다.

  • @ParameterizedTest : 파라미터를 받아 테스트할 수 있는 메서드를 만들 수 있고,
    @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})를 사용하여 파라미터 값을 전달 할 수 있습니다. 전달되는 파라미터 수 만큼 테스트 메서드가 수행된다. int, String 등 여러 타입의 파라미터를 전달할 수 있다.

Assertions

  • Assertions.assertEquals(expected, actual) : 첫 번째 파라미터에 예상 값을 넣고, 두 번째 파라미터에 테스트 결과 값을 넣는다. 예상 값과 결과 값이 다르면 실패한다. 세 번째 파라미터 값에 람다식으로 메세지를 넣으면 실패 시 해당 메세지가 출력된다.

  • Assertions.assertTrue(boolean): 해당 파라미터의 값이 true인지 확인한다.

  • Assertions.assertNotNull(actual) : 해당 파라미터 값이 null이 아님을 확인한다.

  • Assertions.assertThrows(expectedType, executable) : 첫 번째 파라미터에 예상하는 Exception 클래스 타입을 넣고 두 번째 파라미터에 실행 코드를 넣는다. 실행 코드의 결과가 예상한 해당 클래스 타입이라면 테스트에 성공한다.

Givne - When - Then 패턴

  • 테스트 코드의 스타일을 표현하는 방식이다.

  • Given : 테스트하고자 하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언한다.

  • When : 테스트 하고자 하는 대상을 실제로 실행한다.
  • Then : 어떤 특정한 행동으로 인하여 발생할 것으로 예상되는 결과에 대해 예측하고 맞는지 확인한다.
profile
개발하는 미어캣

0개의 댓글