Spring

[스프링 #7] Test

zamezzz 2019. 3. 30. 20:49

 스프링 #7. Test

 

스프링 프레임워크에서 '테스트'란 가장 중요한 가치라고 합니다.

 

테스트의 작성은 스프링의 다양한 기술을 활용하는 방법을 이해하고 검증하고, 실전에 적용하는 방법을

 

익히는데 효과적으로 사용될 수 있습니다.

 

 

Test

 

테스트란 결국 개발자가 의도했던 대로 코드가 정확히 동작하는지를 확인하는 작업입니다.

 

또한 테스트의 결과가 원하는 결과가 아닌 경우 코드나 설계에 결함이 있음을 알 수 있습니다.

 

아래 코드는 UserDao의 오브젝트를 가져와 get 메소드를 호출하는 테스트 코드입니다.

 

테스트 결과를 콘솔에 출력하며, 문제가 없다면 출력되어 끝날 것입니다.

 

// UserDao의 메소드를 테스트하는 경우

public class UserDaoTest {

  public static void main(String[] args) {

    ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");

   

    @Autowired

    UserDao userDao;

 

    User user = new User();

    user.setId("test");

    user.setName("testName");

 

    User user2 = userDao.get(user.getId());

 

    if(user.getName().equals(user2.getName())) {

      System.out.println("Test Success");

    } else System.out.println("Test Fail");

  }

}

테스트는 위처럼 가능하다면 작은 단위를 테스트해야 합니다. 이를 '단위 테스트(unit test)' 라고 합니다.

 

너무 많이 몰아서 테스트하면 그 과정도 복잡하고 정확한 원인을 찾기도 힘들기 때문이죠.

 

 

 

 JUnit Test

 

좀 더 단순하면서도 실용적인 테스트를 위해서 JUnit이라 불리는 테스트 도구를 사용하면 좋습니다.

 

JUnit은 말 그대로 자바로 단위 테스트를 만들 때 유용하게 사용할 수 있습니다.

 

JUnit은 테스트 메소드를 만들 때 2가지 조건을 꼭 충족시켜야 합니다.

 

첫 번째는 메소드가 public이어야 하며, 두 번째는 @Test 어노테이션을 붙여야 한다는 것입니다.

// UserDao의 메소드를 JUnit으로 변경 후 테스트

public class UserDaoTest {

  @Test

  public void getUser {

    ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");

   

    @Autowired

    UserDao userDao;

 

    User user = new User();

    user.setId("test");

    user.setName("testName");

 

    User user2 = userDao.get(user.getId());

 

    assertThat(user2.getName(), is(user.getName()));

  }

}

위 코드가 기존 test코드를 JUnit으로 변경한 것입니다.

 

위에서 말한 것 처럼 public 메소드와 @Test어노테이션을 붙여주었죠.

 

그리고 마지막줄의 assertThat() 메소드만 추가되었고 나머지는 동일합니다.

 

assertThat() 메소드는 첫번째 파라미터 값과 is의 파라미터 값을 비교하여 일치하면 성공, 다르면

 

실패하도록 해주는JUnit의 메소드입니다. 그러므로 여기서는 굳이 콘솔에 메세지를 출력할 필요가 없습니다.

 

 Test 코드 개선

 

테스트 코드들 또한 좀 더 깔끔하고 이해하기 쉽게 리팩토링 할 수 있습니다.

 

위의 테스트 코드를 보면 반복되는 코드가 있습니다.

ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");

 

이 부분이죠. 이러한 반복을 해결하기 위해서는 별도의 메소드로 뽑아내 사용하는 것이 일반적인 방법입니다.

 

하지만 JUnit에서 제공하는 기능을 통해 더욱 쉽게 이러한 비효율을 해결할 수 있습니다.

// UserDao의 메소드를 JUnit으로 변경 후 테스트

public class UserDaoTest {

  @Before

  public void setUp() {

    ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");

  }

 

  @Test

  public void getUser {

    ... 중략 ...

  }

}

위의 코드와 같이 @Before 어노테이션을 활용하는 것입니다.

 

JUnit은 @Test가 붙은 메소드를 실행하기 전 @Before 메소드가 붙은 메소드를 먼저 실행합니다.

 

이후에 @Test가 붙은 메소드를 실행합니다. 그리고 @Before와 반대로 @After 메소드 또한 있습니다.

 

이는 @Test가 붙은 메소드 이후에 실행되는 메소드입니다. 이를 통해 정리 작업을 공통으로 처리 가능합니다.

 

 

이 처럼 스프링의 테스트를 사용하면 많은 효율적인 작업이 가능합니다.

 

스프링을 사용한다면 자신이 만든 코드를 테스트로 검증하는 방법을 알고, 이를 효율적으로 잘 활용할 수 있도록

 

연습한다면 좋을 것 같습니다. 감사합니다.

반응형

'Spring' 카테고리의 다른 글

[R2DBC] R2DBC란 무엇인가?  (0) 2022.07.22
STOMP에 대한 이해  (0) 2022.03.14
[스프링 #6] Custom Annotation  (0) 2018.05.30
[스프링 #5] DispatcherServlet  (0) 2018.05.05
[스프링 #4] 의존관계 주입 (DI) - 2  (0) 2018.02.24