본문 바로가기
Develop/Spring

[Spring] JUnit을 활용한 스프링 메서드 모듈 테스트하기

by 코딩의성지 2020. 3. 29.

하이 ...!! 여러분 !!

 

스프링TDD (Test Driven Development) 기반의 개발을 할 수 있도록 스프링 프로젝트를 만들때 알아서 테스트 환경을 세팅해준다. 우리는 거기다 코드를 작성해서 테스트를 하면된다.

 

우리는 지난 포스팅들에서 작성했던 CRUD 프로젝트에서 JUnit을 활용하여 단위테스트를 해볼꺼다.

 

JUnit?

 

JUnit은 말그대로 독립된 단위 테스트를 지원해주는 Java의 프레임워크이다.

단위테스트는 소스코드의 특정한 모듈이 내가 의도한 대로 올바르게 동작하는지 검증하는 것을 의미한다.

만약 여러분들이 단위테스트를 잘 작성하면 더 나은 코드를 작성할 수 있고 이는 비용 감소로 이어질테니 잘 작성해서 활용해보길 바란다.

 

회사에서 일을 하다보면 테스트가 굉장히 귀찮게 여겨지고 .. 이런 테스트 케이스 작성하는 과정을 축소하거나 삭제해버리곤 하는데 ... ( 물론 나도 그렇다...) 이는 굉장히 잘못되고 위험한 방법이니 테스트 케이스를 올바르게 작성하는 습관을 들이도록하자.

 

 

 

 

테스트 코드 구현

 

우리는 JUit 5 버전을 사용할 것이다. 

 

구현 전에 내가 이전에 어떻게 CRUD 를 구현했는지 한번 보고 오자. 이걸 보고오셔야 지금 내가 작성한 테스트 코드가 무엇인지 아실 수 있을 테니 말이다.

 

https://devkingdom.tistory.com/110

 

[Spring] REST에서 CRUD 구현하기

하이 ㅎㅎㅎ 요즘 날씨 진짜 진짜 좋다 ~~!! ㅎㅎ 오늘은 그 동안 갈고 닦은 기본기(?) 를 바탕으로 CRUD를 정석대로 구현해볼꺼다. 다들 잘 따라해보고, 나중에 Spring으로 API 만들거나 웹서비스 만들 때 잘 사..

devkingdom.tistory.com

 

우리는 작성한 코드 중 UserService 와 UserDao를 테스트하는 코드를 작성해볼거다.

 

여기서 우리가 주의해야할 점은 테스트를 수행하기전에 먼저 테스트 메서드가 어떤 상황에서 정상 통과할 것인지 결정해줘야한다.

 

작성하는 단위 테스트 클래스 역시 POJO 이다.

 

 

먼저 아래의 코드는 UserService를 테스트하는 UserServiceTest 클래스이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import com.test.crudPjt.CrudPjtApplication;
import com.test.crudPjt.model.User;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;
 
import java.util.List;
 
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = CrudPjtApplication.class)
@ActiveProfiles("test")
public class UserServiceTests {
    @Autowired
    private UserService userService;
 
    @Test
    public void testGetAllUsers() {
        List<User> users= userService.getAllUsers();
        Assertions.assertTrue(users.size()>0);
    }
 
    @Test
    public void testGetUserByUserId() {
        User user = userService.getUserByUserId("testId1");
        Assertions.assertTrue(user.getUserNo() > 0);
    }
 
    @Test
    public void testRegisterUser() {
        User user = new User(0"testName""testId""testPwd");
        User test = userService.registerUser(user);
    }
 
    @Test
    public void testModifyUser() {
//Todo
    }
 
    @Test
    public void testRemoveUser() {
//Todo
    }
    
}
 

내 나름대로 ... 정상 통과의 기준을 세워서 코드를 작성해봤다.

 

테스트 코드를 실행시키는 방법은  아래와 같다. 내가 .. IntelliJ 를 사용하고 있으니 그 기준으로 말씀드리겠다.

 

클래스 옆의 실행 버튼은 테스트 코드를 전체 실행시키는 것이고, 아래 메서드 옆의 실행 버튼은 각각의 메서드를 하나씩 실행시키는 것이다.

 

결과는 ..

 

이렇게 녹색으로 체크 되면 테스트가 성공하는 것이다.

 

비슷하겠지만 아래는 UserDao에 대한 테스트 클래스니 참고 바란다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
 
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = CrudPjtApplication.class)
@ActiveProfiles("test")
public class UserDaoTests {
    @Autowired
    private UserDao userDao;
 
    @Test
    public void testGetAllUsers() {
        List<User> users = userDao.getAllUsers();
        Assertions.assertTrue(users.size()>0);
    }
 
    @Test
    public void testGetUserByUserId() {
        User user = userDao.getUserByUserId("testId1");
        Assertions.assertTrue(user.getUserNo() > 0);
    }
 
    @Test
    public void testInsertUser() {
        User user = new User(0"testName""testId""testPwd");
        User test = userDao.insertUser(user);
    }
 
    @Test
    public void testUpdateUser() {
        //Todo
    }
 
    @Test
    public void testDeleteUser() {
        //Todo
    }
 
}

 

아 이렇게 하나하나 테스트하는 코드도 작성할 수 있긴한데... mockMVC라는 녀석을 이용해서 E2E ( End to End ) 테스트도 할 수 있다. 즉 한 api의 요청부터 결과까지 한방에 테스트가 가능하다는 말이다.

이건 추후에 구현해보도록 하겠다.

 

오늘은 여기까지다. 모두들 즐거운 하루보내고 내일 월요일인데 내일도 화이팅하자 ^^ ㅎㅎ 

반응형

댓글