2. 테스트 - main (UserDaoTest) 개선

이유석·2022년 3월 30일
0

Book - Toby's Spring

목록 보기
10/20
post-thumbnail

2.2 main (UserDaoTest) 개선

main (UserDaoTest)에는 두 가지 문제점이 있다.

  • 수동 확인(테스트 검증) 작업의 번거로움
  • 실행 작업의 번거로움

이 두 가지 문제점을 개선해보자.

2.2.1 테스트 검증의 자동화

현재 테스트를 통해 검증하고 싶은 사항은 두 가지 이다.

  • add( )에 전달한 User오브젝트의 정보가 빠짐없이 DB에 등록되었는지
  • add( )를 통해 DB에 등록된 User오브젝트의 정보를 DB에서 정확히 가려왔는지

이를 확인하기 위해 아래의 정보들이 서로 일치한지에 대한 테스트를 진행한다.

  • add( )에 전달한 User오브젝트에 담긴 사용자 정보
  • get( )통해 다시 DB에서 가져온 User오브젝트의 정보

테스트에서의 성공과 실패

  • 성공 : 기대했던 결과대로 테스트가 수행 되었을 시
  • 실패
    • 테스트 에러 : 테스트가 진행되는 동안에 에러가 발생하여 실패
    • 테스트 실패 : 테스트 결과가 기대했던 결과와 다를 경우

기존의 테스트 코드를 위의 경우로 다시 나누어서 수정해 보겠다.

if (!user.getName().equals(searchedUser.getName())) {
        System.out.println("테스트 실패 (name)");
    } 
else if (!user.getPassword().equals(searchedUser.getPassword())) {
        System.out.println("테스트 실패 (password)");
    } 
else {
        System.out.println("조회 테스트 성공");
    } 

Comprehensive test (포괄적인 테스트)

  • 만들어진 코드의 기능을 모두 점검할 수 있는 테스트

2.2.2 테스트의 효율적인 수행과 결과 관리

main( )메소드를 이용한 테스트 작성 방법만으로는 애플리케이션 규모가 커지고 테스트 개수가 많아지면, 테스트를 수행하는 일이 점점 부담이 될 것이다.

JUnit : 자바로 단위 테스트를 만들 때 유용하게 쓸 수 있는 도구 (프레임워크)

JUnit 테스트로 전환

JUnit은 프레임워크 이다.

  • 프레임워크의 기본 동작원리는 IoC (제어의 역전) 이다.
  • 개발자가 만든 클래스에 대한 제거 원한을 넘겨받아서 주도적으로 애플리케이션의 흐름을 제어한다.

따라서 프레임워크에서 동작하는 코드는 main( )메소드도 필요 없고, 오브젝트를 만들어서 실행시키는 코드를 만들 필요도 없다.

JUnit을 사용하기 위해 추가할 라이브러리 : com.springsource.org.junit-4.7.0.jar

테스트 메소드 전환

main( )메소드 내부의 테스트 코드를 일반 메소드로 옮겨보겠다.

새로 만들 테스트 메소드는 JUnit 프레임워크가 요구하는 두 가지 조건을 만족하여야 한다.

  • 메소드가 public으로 선언돼야 한다.
  • 메소드에 @Test 애노테이션을 붙여줘야 한다.
@Test
    public void addAndGet() throws SQLException {
        ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		...
	}

테스트 메소드 이름은 의도가 무엇인지 알 수 있는 이름이 좋다.

검증 코드 전환

테스트의 결과를 검증하는 if/else 문장을 JUnit이 제공하는 방법을 이용해 전환해보자.

if (!user.getName().equals(searchedUser.getName())) {
            System.out.println("테스트 실패 (name)");
        } 

이 if 문장의 기능을 JUnit이 제공해주는 assertThat이라는 스태틱 메소드를 이용해 아래와 같이 변경할 수 있다.

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

assertThat( )메소드

  • 첫번째 파라미터의 값을 뒤에 나오는 matcher(매처)라고 불리는 조건으로 비교한다.
    • 일치하면 다음으로 넘어간다.
    • 불 일치하면 테스트가 실패한다. (AssertionErrot 가 던져진다.)

is( )메소드

  • 매처의 일종으로 equals( )로 비교해주는 기능을 가졌다.

JUnit 테스트 실행

JUnit 프레임워크도 자바 코드로 만들어진 프로그램이므로 어디선가 한 번은 시작돼야 한다.

어디에든 main( )메소드를 하나 추가하고, 그 안에 JunitCore 클래스의 main 메소드를 호출해주는 코드를 넣어주면 된다.

  • main 메소드 파라미터에는 @Test 테스트 메소드를 가진 클래스의 이름을 넣어준다.
public static void main(String[] args) {
        JUnitCore.main("springbook.user.dao.main");
}

소스코드 : github

profile
https://github.com/yuseogi0218

0개의 댓글