ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2장) 2.1 USERDAOTEST 다시보기 ~ 2.2 USERDAOTEST 개선
    Java & Spring/토비의 스프링 3.1 2021. 5. 27. 13:51
    반응형

    2장 테스트

    • 객체지향 기술과 더불어 하나의 도구로 스프링이 강조하고 가치를 둔다.

    2.1 UserDaoTest 다시보기

    • 테스트의 유용성

      • 테스트란, 예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인 ~> 확신
        • 결과가 원하는 대로 나오지 않는 경우 ~> 코드나 설계에 결함 확인
    • 웹을 통한 DAO 테스트 방법의 문제점

      • 문제점
        • DAO 뿐만 아니라 서비스, 컨트롤러, 뷰 등 모든 레이어 기능을 만든 후, 테스트가 가능
        • 테스트에 실패하면, 어디에서 문제가 발생했는지 찾아야하는 수고가 필요
    • 단위 테스트

      • 테스트는 가능하면 작은 단위로 쪼개서 집중해서 할 수 있어야한다.

      • 관심이 다르다면, 테스트할 대상을 분리하고 집중해서 접근한다

      • 작은 단위 코드에 대한 테스트가 단위 테스트이다.

        • 정해진 범위나 단위가 정해지지는 않았지만, 하나의 관심에 집중해서 효율적으로 테스트할 만한 범위
      • 통제할 수 없는 외부 리소스에 의존하는 테스트는 단위 테스트가 아니라고 보기도 한다

        • 테스트에 DB가 사용되는 경우

          • DB 상태가 매번 달라지고, 테스트를 위해 DB를 특정 상태로 만들어줄 수 없는 경우

            ~> 테스트로서 가치가 없음

    • 자동수행 테스트 코드

      • 번거로운 작업이 없이 자주 반복할 수 있어야 한다
        • 운영 중인 코드를 수정하려고 하면 간단한 수정이라도, 전체 애플리케이션에 문제를 일으키지 않을까 하는 고민이 생긴다.
        • 이 때, 자동 수행 테스트를 통해, 최대한 빠르게 확인하고 성공하는지 확인해야한다.
    • 지속적인 개선 & 점진적인 개발을 위한 테스트

      • 앞서 초난감 DAO코드를 개선해나갔는데, DAO 기능에 문제가 없는지 검증하는 테스트를 만들어 두고, 자신을 가지고 코드를 개선해나갔다.
      • 기능을 만들고, 테스트로 검증 ~> 코드에 대한 확신을 갖는다.
      • 기능을 조금씩 추가하면서, 테스트도 함께 추가 ~> 점진적인 개발
    • UserDaoTest의 문제점

      • 수동 확인 작업의 번거로움
        • 현재 작성된 코드는 콘솔에 값만 출력해줄 뿐, 결과를 확인하는 일이 사람의 책임으로 되어있다.
          • 검증의 양이 많고 복잡해지면 실수할 가능성이 높아짐
      • 실행 작업의 번거로움
        • 테스트 규모가 커질수록 main() 메소드를 호출해야하는 번거로움이 증가하고, 결과를 확인하고 문서화하는 작업이 개발만큼 큰 작업이 될 수 있음

    2.2 UserDaoTest 개선

    • 테스트 검증의 자동화

      • 모든 테스트는 성공 / 실패 로 결과가 나뉜다.
      • getName, getPassword의 값이 같은지 다른지 비교하여, if / else를 통해 테스트를 성공 / 실패 처리해주도록 바꾼다.
    • 테스트의 효율적인 수행과 결과 관리

      • main() 메소드를 이용한 테스트 작성 방법
        • 애플리케이션 규모가 커지고 테스트 개수가 많아지면 테스트 수행이 점점 부담
      • JUnit
        • 자바로 단위 테스트를 만드는 것을 지원해주는 라이브러리
    • JUnit 테스트로 전환

      • 테스트 메소드의 조건

        • public으로 선언되야 한다.
        • @Test 애노테이션을 붙여야 한다.
      • public class UserDaoTest {
            // ...
            @Test
            public void addAndGet() throws SQLException {
                ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
                UserDao dao = context.getBean("userDao", UserDao.class);
                // ...
            }
        }
        • 테스트 메소드 조건에 따라 바꾸어 주면 위와 같은 형태의 코드가 된다.
        • @Test 애노테이션마다 하나의 단위 테스트가 됨
    • 검증 코드 전환

      • 위에서 if / else 처리했던 문장을 JUnit이 제공해주는 assertThat을 사용해서 변경

        • assertThat(user2.getName(), is(user.getName()));
    반응형

    댓글

Designed by Tistory.