티스토리 뷰
단위 테스트(Unit Test)
-개별적인 컴포넌트 또는 메서드 등의 작은 단위를 테스트하는 단계입니다.\
주로 코드의 기능을 확인하고 버그를 발견하는데에 초점을 둡니다.
개별적인 단위의 코드를 테스트하기 때문에 각각의 부분을 나눠서 오류의 위치를 빠르게 찾을 수 있습니다.
스프링에서는 주로 JUnit을사용합니다.
통합 테스트(Integration Test)
-여러 컴포넌트 또는 서비스 간의 상호작용을 테스트하여 전체적인 시스템의 동작을 확인하는 단계입니다.
개별적인 단위들을 합쳐서 서로 상호작용을 테스트하기에 실제 어플과 유사하게 테스트를 진행합니다.
외부와의 연결(데이터베이스, 웹 서비스등..)을 통해 실제 어플의 환경을 구축할 수 있습니다.
단위 테스트 | 통합 테스트 | |
범위 | 함수,메서드,클래스... | 여러개의 단위 |
시행 단계 | 개발 초기 | 개발 중후반 |
테스트 대상 | Model,Service | DB,Controller.... |
사용 기술 | Junit | Junit,Spring Boot |
Junit이란?
-자바용 단위 테스트(Unit Test) 프레임워크로 개발자가 자바 코드의 기능을 쉽게 테스트할 수있게 도와줍니다.
다양한 어노테이션을 지원하여 여러개의 단위 테스트를 한번에 진행할 수있고, 단정문을 사용하여 테스트 예상 결과와 실제 결과를 비교하고 테스트를 판정할 수 있게 해줍니다.
JUnit 애노테이션
- @Test
-테스트 메서드를 정의할 때 사용하는 애노테이션입니다.
@Test 지정된 메서드는 실행 시 해당 메서드가 테스트 실행됩니다.
테스트 결과는 성공,실패, 무시로 표시됩니다. - @Before
-각 테스트 메서드(@Test)가 실행되기전에 실행되는 메서드입니다.
주로 초기화 작업이나 공통적으로 필요한 설정을 수행하는데 사용됩니다.
중복코드를 제거하고 테스트 일관성을 높일 수 있습니다. - @After
-각 테스트 메서드(@Test)가 실행된 후에 실행되는 메서드입니다.
주로 테스트 실행 후 정리 작업, 리소스해제등의 작업을 수행하는데 사용됩니다.
중복코드를 제거하고 테스트 일관성을 높일 수 있습니다. - @BeforeClass
-모든 테스트 메서드(@Test)가 실행되기 전에 한번만 실행되는 메서드입니다.
주로 클래스 설정작업 및 초기화 작업을 수행하는데 사용됩니다.
클래스단위에서 한번만 정의되어야 합니다. - @AfterClass
-모든 테스트 메서드(@Test)가 실행된 후에 한번만 실행되는 메서드입니다.
주로 클래스 정리작업 및 리소스해제 작업을 수행하는데 사용됩니다.
클래스단위에서 한번만 정의되어야 합니다.
public class CalculatorTest {
private Calculator calculator;
@Before
public void setUp() {
calculator = new Calculator();
System.out.println("Setting up Calculator");
}
@After
public void tearDown() {
calculator = null;
System.out.println("Tearing down Calculator");
}
@Test
public void testAddition() {
int result = calculator.add(2, 3);
assertEquals(5, result);
}
@Test
public void testSubtraction() {
int result = calculator.subtract(5, 3);
assertEquals(2, result);
}
}
Junit 단정문(Assertions)
- assertEquals( expected , acutal )
-예상 값과 실제 값을 비교하여 같은지 확인하는 문장
-두 값이 서로 다를 경우 테스트가 실패로 판정 - assertTrue(condition)
-주어진 조건이 참인지 확인하는 문장
조건이 거짓인 경우 테스트가 실패로 판정 - assertFalse(condition)
-주어진 조건이 거짓인지 확인하는 문장
조건이 참인 경우 테스트가 실패로 판정 - assertNull(object)
-주어진 객체가 null인지 확인하는 문장
-객체가 null이 아닌 경우 테스트가 실패로 판정 - assertNotNull(object)
-주어진 객체가 null이 아닌지 확인하는 문장
-객체가 null인 경우 테스트가 실패로 판정 - assertSame( expected , actual )
-예상 값과 실제 값이 같은 객체인지 확인하는 문장
-두 객체가 서로 다른 객체일경우 테스트가 실패로 판정.
@SpringBootTest
public class MyServiceTest {
@Autowired
private MyService myService;
@Test
public void testMethod1() {
int expectedValue = 5;
int actualValue = myService.addNumbers(2, 3);
assertEquals(expectedValue, actualValue, "The sum of numbers should be 5");
}
@Test
public void testMethod2() {
String expectedValue = "Hello, World!";
String actualValue = myService.getGreeting();
assertNotNull(actualValue, "The greeting should not be null");
assertEquals(expectedValue, actualValue, "The greeting should be 'Hello, World!'");
}
}
Given-When-Then
-소프트웨어 테스트에서 일반적으로 사용되는 테스트 구조화 패턴입니다. 주로 이 패턴으로 테스트 케이스를 구성하고 가독성 및 테스트 목적을 명확하게 할 수 있습니다.
- Given
-테스트 환경을 설정하고 초기상태를 구성하는 부분입니다.
테스트에 필요한 객체, 데이터들을 설정합니다. - When
-테스트하려는 동작 또는 이벤트를 발생시키는 부분입니다.
테스트 대상 메서드를 호출하거나 특정 동작을 수행합니다. - Then
-테스트 예상 결과를 검증하는 부분입니다.
단정문을 사용하여 테스트 예상한 결과와 실제 결과를 비교합니다.
@Test
public void testCalculateTotalPrice() {
// Given
ShoppingCart cart = new ShoppingCart();
cart.addItem(new Item("Product 1", 10.0));
cart.addItem(new Item("Product 2", 20.0));
// When
double totalPrice = cart.calculateTotalPrice();
// Then
assertEquals(30.0, totalPrice, "The total price should be 30.0");
}
@SpringBootTest
-스프링 부트 테스트에서 사용되는 어노테이션으로 통합 테스트를 진행할 수 있는 애노테이션입니다.
통합테스트에 필요한 다양한 설정을 자동으로 설정해줍니다.
@SpringBootTest가 자동을 설정해주는 것들
- 스프링 컨테이너 로드
-스프링 컨테이너를 자동으로 로드하여 빈들을 테스트에서 직접 주입하여 활용할 수 있게 합니다. - 빈 주입
-@Autowired를 통해 테스트에서 필요한 빈을 주입받을 수 있게 설정해줍니다. - 내장 서버 자동 시작
-통합 테스트를 위해 내장된 서버를 자동으로 시작하여 테스트에서 사용할 수 있게 합니다. - 테스트 데이터베이스
-테스트용 데이터베이스를 자동으로 구성하여, 실제 데이터베이스 연결을 테스트용으로 설정할 수 있습니다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class IntegrationTest {
@Autowired
private UserService userService;
@Autowired
private OrderService orderService;
@Test
public void testUserOrder() {
// 사용자 생성
User user = new User("John", "Doe");
userService.createUser(user);
// 주문 생성
Order order = new Order("ABC123", 10);
orderService.createOrder(user, order);
// 주문 상태 확인
OrderStatus status = orderService.getOrderStatus(order.getId());
assertEquals(OrderStatus.PENDING, status);
}
// 추가적인 테스트 메서드 작성 가능
}
MOCK객체
-실제 객체를 대신하여 테스트에서 사용되는 가짜개체입니다.
즉, 실제로 존재하는 객체가 아닌 테스트를 위해 생성된 실험용 객체입니다. 주로 테스트에서 객체를 테스트용도로 생성해 사용됩니다.
MOCK 객체를 통해 실제 데이터베이스나 외부서비스와의 상호작용을 없애 테스트 환경을 격리시킵니다.
MOCK객체 특징
- 스프링 테스트에서 사용하는 빈을 대신해 생성됨.
- @MockBean 애노테이션을 통해 Mock 객체를 생성할 수 있음.
- MOCK객체를 통해 외부 서비스, 컴포넌트 등의 의존성 격리해 기능테스트 가능함.
mock객체 예시코드
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceIntegrationTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
public void testSaveUser() {
User user = new User("john_doe", "john@example.com");
// UserRepository의 save 메서드가 호출될 때, 가짜 데이터를 리턴하도록 설정
when(userRepository.save(user)).thenReturn(user);
User savedUser = userService.saveUser(user);
// 테스트 결과 검증
assertNotNull(savedUser);
assertEquals(user.getUsername(), savedUser.getUsername());
assertEquals(user.getEmail(), savedUser.getEmail());
}
}
MockMVC
-스프링 프레임워크에서 제공하는 스프링 테스트를 위한 클래스입니다. 이는 사용해 웹 계층인 컨트롤러를 테스트 할 수 있으며, 컨트롤러의 동작을 시뮬레이션하고 테스트할 수 있습니다.
MockMVC 특징
- 별도의 서버 실행 없이 MVC에서의 컨트롤러 테스트 가능.
- HTTP 요청 메세지를 생성하여 통신테스트 가능.
- 자체 API 메서드를 사용하여 추가 HTTP 정보 및 응답검증을 할 수 있음.
MockMVC 예시코드
@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetRequest() throws Exception {
// GET 요청을 생성하고, "/api/resource" URL로 보냅니다.
mockMvc.perform(get("/api/resource"))
.andExpect(status().isOk()) // 응답의 상태 코드가 200인지 확인합니다.
.andExpect(content().string("Hello, World!")); // 응답 본문의 내용을 검증합니다.
}
}
'자바 > 스프링' 카테고리의 다른 글
스프링 웹소켓(Web Socket) (STOMP) (0) | 2023.08.05 |
---|---|
스프링 데이터베이스 연결(JDBC,JPA) (0) | 2023.07.02 |
HTTP 데이터 삽입 방법 (0) | 2023.07.01 |
스프링 컨트롤러 Mapping (0) | 2023.06.29 |
빈 라이프사이클 및 스코프 (0) | 2023.06.27 |