티스토리 뷰

반응형


| 단위 테스트?



프로젝트를 진행하는 중간중간

구현이 잘 되어가고 있는지 확인하기 위해

테스트를 해주는게 중요하다.


Spring에서는 개발과 테스트를 분리해서 해볼 수 있다.

즉 src 영역과 test 영역이 나뉘어져 있다.


기존에는 아래와 같이 bean이 잘 등록되었는지 확인하곤 했었다..

1
2
3
4
5
6
7
8
9
10
public class TestClient {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);
 
        String[] beans = ctx.getBeanDefinitionNames();
        for(String bean : beans) {
            System.out.println(bean);
        }
    }
}
cs


하지만, 위와 같은 테스트가 여러 번 진행될 때의 번거롭고 불편한 단점을 보완하기 위해 단위 테스트가 도입된 것이다.






|| 단위 테스트를 위한 라이브러리 준비



spring에서 단위 테스트를 하기 위해

- spring-test

- junit(4.12 버전 이상)

이 필요하다.


라이브러리를 세팅해주자.


/pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        <!-- https://mvnrepository.com/artifact/junit/junit -->    
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework-version}</version>
            <scope>test</scope>
        </dependency>
cs




다음은 로거 level을 설정해주어야 한다

Application Loggers 의 Level을 trace 로 설정해주자.


로거에 대한 설명은 아래 글을 참고해보자!

[Spring] log4j.xml 로그 확인하기


src/main/resource/log4j.xml

1
2
3
4
    <!-- Application Loggers -->
    <logger name="com.cristoval.web">
        <level value="trace" />
    </logger>
cs






|| 단위 테스트 실행



이제

/src/test/java/com/cristoval/web/ 

test 영역에 BeanTest class 를 만들고 Bean이 잘 등록되었는지 테스트해보자.


먼저, 단위 테스트를 스프링과 연동하기 위해 

@RunWith(SpringRunner.class)

환경설정 파일을 명시하기 위해

@ContextConfiguration(classes = ApplicationConfig.class)

를 작성해주자.


DataSource Bean 이 잘 등록되었는지 확인해볼 것이다.


src/test/java/com/cristoval/web/BeanTest.java

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
package com.cristoval.web;
 
import static org.junit.Assert.assertNotNull;
 
import javax.sql.DataSource;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
 
import com.cristoval.web.config.ApplicationConfig;
 
//단위테스트를 스프링과 연동
@RunWith(SpringRunner.class)
//환경설정 파일 명시
@ContextConfiguration(classes = ApplicationConfig.class)
public class BeanTest {
 
    private static final Logger logger = LoggerFactory.getLogger(BeanTest.class);
    
    // Autowired 로 Bean 생성 확인
    @Autowired
    DataSource ds;
    
    @Autowired
    SqlSessionTemplate st;
    
    // 모든 테스트들은 @Test를 갖는다.
    @Test
    public void dsTest() {
        // DataSource가 null이 아니다! 
        assertNotNull(ds);
    }
    
    @Test
    public void templateTest() {
        // SqlSessionTemplate가 null이 아니다!
        assertNotNull(st);
    }
    
}
 
cs




코드 작성 후

Rus As -> JUnit Test 를 눌러 테스트를 실행한다.





테스트가 실행되면 

JUnit 창이 뜨게 되고

우측 상단에 초록 bar가 보이면 단위 테스트에 이상이 없는 것이다.

assertNotNull()의 테스트가 통과(?)했다는 의미라고 생각하면 된다.

그리고 좌측에는 정상적으로 @Autowired 된 Bean을 확인할 수 있다.




반대로

assertNull()로 테스트해보면 

1
2
3
4
5
6
7
8
9
10
11
    @Test
    public void dsTest() {
        // DataSource가 null 인지 확인 
        assertNull(ds);
    }
    
    @Test
    public void templateTest() {
        // SqlSessionTemplate가 null 인지 확인 
        assertNull(st);
    }
cs



빨간 bar가 보이게 된다.




|| 그 밖의 테스트



단위 테스트는 개발자가 구현이 잘 되고 있는지 확인하는 과정이므로

어떤 데이터가 얼마나 있는지 알고 있다.

알고 있는 데이터를 활용하여 테스트하면 된다.


즉, 데이터가 3개 있는 것을 알고 있다면,

굳이 쿼리로 데이터를 count 해볼 필요가 없다는 것이다.


ServiceTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ApplicationConfig.class)
public class ServiceTest {
    
    @Autowired
    UserService service;
    
    @Test
    public void testBean() {
        assertNotNull(service);
    }
    
    @Test
    public void loginTest() {
        UserInfo info = service.login("admin""admin");
        assertEquals(info.getName(), "관리자");
        
        info = service.login("admin""admin");
        assertNull(info);
    }
    
}
 
cs




DML 쿼리를 테스트해볼 경우,

@Transactional annotaion 을 사용해주면

만들었다가 지웠다가~

수정했다가 돌려놓다가~ ..

할 필요 없이 테스트가 끝난 후 자동으로 rollback을 해준다.

정말 좋다..



RepoTest.java

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
49
50
51
52
53
54
55
56
57
58
59
60
61
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ApplicationConfig.class)
public class RepoTest {
 
    @Autowired
    UserRepository urepo;
 
    @Test
    public void beanTest() {
        assertNotNull(urepo);
    }
 
    @Test
    public void selectTest() {
        UserInfo user = urepo.select("admin");
        assertNotNull(user);
        assertEquals(user.getName(), "관리자");
        assertEquals(user.getPassword(), "admin");
 
        user = urepo.select("admin2");
        assertNull(user);
    }
 
    @Test
    public void selectAllTest() {
        List<UserInfo> users = urepo.selectAll();
        assertTrue(users.size() == 2);
    }
 
    @Test
    @Transactional // 테스트 끝난 후 자동 rollback
    public void insertTest() {
        UserInfo user = new UserInfo("hong""홍길동""hong");
        int result = urepo.insert(user);
        assertTrue(result == 1);
 
        UserInfo selected = urepo.select(user.getUserId());
        assertEquals(user.getName(), selected.getName());
    }
 
    @Test
    @Transactional
    public void updateTest() {
        UserInfo selected = urepo.select("admin");
        selected.setName("수정본");
        urepo.update(selected);
 
        UserInfo selected2 = urepo.select("admin");
        assertEquals(selected2.getName(), "수정본");
    }
 
    @Test
    @Transactional
    public void deleteTest() {
        urepo.delete("admin");
        UserInfo selected = urepo.select("admin");
        assertNull(selected);
    }
 
}
 
cs





** 읽어보고 싶은 참고 글 **


반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday