티스토리 뷰
| 단위 테스트?
프로젝트를 진행하는 중간중간
구현이 잘 되어가고 있는지 확인하기 위해
테스트를 해주는게 중요하다.
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에서 단위 테스트를 하기 위해
- 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 로 설정해주자.
로거에 대한 설명은 아래 글을 참고해보자!
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 |
** 읽어보고 싶은 참고 글 **
[Spring-myBatis] Spring-myBatis 프로젝트를 만들어보자 !
'Web > Spring' 카테고리의 다른 글
[Spring] REST API(jackson-databind) (0) | 2020.10.26 |
---|---|
[Spring-myBatis] Spring-myBatis Business Logic 구현을 해보자! (0) | 2020.10.23 |
[Spring-myBatis] Spring-myBatis 프로젝트를 만들어보자 ! (0) | 2020.10.23 |
[MyBatis] MyBatis Setting 을 해보자 ! (4) | 2020.10.22 |
[Spring] Spring@MVC 구조 및 @annotation 살펴보기. (0) | 2020.10.21 |