티스토리 뷰

테스트

스프링이 개발자에게 제공하는 가장 중요한 가치는 객체지향테스트이다. 이 장에서 설명할 테스트 기술은 만들어진 코드를 확신할 수 있게 해주고, 변화에 유연하게 대처할 수 있는 자신감을 준다. 또한, 테스트는 스프링이나 처음 사용하는 기술을 학습하는 데 있어 가장 효과적인 방법의 하나이다.

테스트의 유용성

테스트는 내가 예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인해서, 만든 코드를 확신할 수 있게 해주는 작업이다.

웹을 통한 테스트 방법의 문제점

웹을 통한 테스트는 많은 문제가 있다. 하나의 테스트를 수행 하는데 참여하는 클래스와 코드가 너무 많은 것이다. Dao를 테스트하는데 서비스 클래스, 컨트롤러, 뷰 등 모든 레이어의 기능을 다 만들고 나서야 테스트가 가능하다. 이런 방식은 번거롭고, 오류가 있을 때 빠르고 정확하게 대응하기 힘들다는 문제가 있다.

작은 단위의 테스트

테스트하고자 하는 대상이 명확하다면 그 대상만 집중해서 테스트 하는 것이 바람직하다. 테스트는 가능하면 작은 단위로 쪼개 집중해서 할 수 있어야 한다. 관심사의 분리라는 원리가 여기에도 적용된다.

단위 테스트(unit test) : 작은 단위의 코드에 대해 테스트를 수행하는 것.

단위 테스트를 하는 이유는 개발자가 설계하고 만든 코드가 원래 의도한 대로 동작하는지를 개발자 스스로 빨리 확인하기 위해서다. 이때 확인의 대상과 조건이 간단하고 명확할수록 좋다.

자동수행 테스트 코드

테스트는 자동으로 수행되도록 코드로 만들어지는 것이 중요하다. 그렇게 되면 자주 반복할 수 있다는 장점을 얻을 수 있다. 번거로운 작업이 없고 테스트를 빠르게 실행할 수 있기 때문에 언제든 코드를 수정하고 나서 테스트를 해볼 수 있다.

지속적인 개선과 점진적인 개발을 위한 테스트

테스트를 이용하면 새로운 기능도 기대한 대로 동작하는지 확인할 수 있을 뿐 아니라, 기존에 만들어뒀던 기능들이 새로운 기능을 추가하느라 수정한 코드에 영향을 받지 않고 여전히 잘 동작하는지를 확인할 수 있다.


JUnit

테스트 프레임워크 중 하나이다. 자바의 표준 테스팅 프레임워크라고 불릴 만큼 폭넓게 사용되고 있다. 스프링의 핵심 기능중 하나인 스프링 테스트 모듈도 JUnit을 이용한다. 따라서 스프링의 기능을 익히기 위해서라도 JUnit은 꼭 사용할 줄 알아야 한다.


포괄적인 테스트

예외조건에 대한 테스트

일반적으로는 테스트 중에 예외가 던져지면 테스트 메소드의 실행은 중단되고 테스트는 실패한다. 예외 발생 여부는 메소드를 실행해서 리턴 값을 비교하는 방법으로 확인할 수 없다는 점이다.

이런 경우를 위해 JUnit은 예외조건 테스트를 위한 특별한 방법을 제공해준다. @Test 애노테이션의 expected 엘리먼트다. expected는 메소드 실행 중에 발생하리라 기대하는 예외 클래스를 넣어주면 된다.

@Testexpected를 추가해놓으면 보통의 테스트와는 반대로, 정상적으로 테스트 메소드를 마치면 테스트가 실패하고, expected에서 지정한 예외가 던져지면 테스트가 성공한다. 예외가 반드시 발생해야 하는 경우를 테스트하고 싶을 때 유용하게 쓸 수 있다.


테스트가 이끄는 개발

테스트 주도 개발 (TDD, Test Driven Development)

만들고자 하는 기능의 내용을 담고 있으면서 만들어진 코드를 검증도 해줄 수 있도록 테스트 코드를 먼저 만들고, 테스트를 성공하게 해주는 코드를 작성하는 방식의 개발 방법

TDD는 아예 테스트를 먼저 만들고 그 테스트가 성공하도록 하는 코드만 만드는 식으로 진행하기 때문에 테스트를 빼먹지 않고 꼼꼼하게 만들어낼 수 있다.

또한, 테스트를 작성하는 시간과 애플리케이션 코드를 작성하는 시간의 간격이 짧아진다.


테스트 코드 개선

JUnit이 하나의 테스트 클래스를 가져와 테스트를 수행하는 방식은 다음과 같다.

  1. 테스트 클래스에서 @Test가 붙은 public이고 void형이며 파라미터가 없는 테스트 메소드를 모두 찾는다.

  2. 테스트 클래스의 오브젝트를 하나 만든다.

  3. @Before가 붙은 메소드가 있으면 실행한다.

  4. @Test가 붙은 메소드를 하나 호출하고 테스트 결과를 저장해둔다.

  5. @After가 붙은 메소드가 있으면 실행한다.

  6. 나머지 테스트 메소드에 대해 2~5번을 반복한다.

  7. 모든 테스트의 결과를 종합해서 돌려준다.

한가지 기억해야 할 사항은 각 테스트 메소드를 실행할 때마다 테스트 클래스의 오브젝트를 새로 만든다는 것이다. 이유는 각 테스트가 서로 영향을 주지 않고 독립적으로 실햄됨을 확실히 보장해주기 위해 매번 새로운 오브젝트를 만들게 했다.

픽스처(fixture) : 테스트를 수행하는 데 필요한 정보나 오브젝트


스프링 테스트 적용

@Autowired

@Autowired는 스프링의 DI에 사용되는 특별한 어노테이션이다. @Autowired가 붙은 인스턴스 변수가 있으면, 테스트 컨텍스트 프레임워크는 변수 타입과 일치하는 컨텍스트 내의 빈을 찾는다. 타입이 일치하는 빈이 있으면 인스턴스 변수에 주입해준다.

인터페이스를 두고 DI를 적용해야 하는 이유

  • 소프트웨어 개발에서 절대로 바뀌지 않는 것은 없기 때문이다.

  • 클래스의 구현 방식은 바뀌지 않는다고 하더라도 인터페이스를 두고 DI를 적용하게 해두면 다른 차원의 서비스 기능을 도입할 수 있기 때문이다.

  • DI는 테스트가 작은 단위의 대상에 대해 독립적으로 만들어지고 실행되게 하는 데 중요한 역할을 한다.

테스트에서만 사용될 클래스가 빈으로 정의된 테스트 전용 설정파일을 따로 만들어서 사용하는 방법도 있다.

침투적 기술과 비침투적 기술

  • 침투적 기술 : 기술을 적용했을 때 애플리케이션 코드에 기술 관련 API가 등장하거나, 특정 인터페이스나 클래스를 사용하도록 강제하는 기술

  • 비침투적 기술 : 애플리케이션 로직을 담은 코드에 아무런 영향을 주지 않고 적용이 가능하다. 스프링은 비침투적인 기술의 대표적인 예이다.


학습 테스트

자신이 만들지 않는 프레임워크나 다른 개발팀에서 만들어서 제공한 라이브러리 등에 대해서 작성하는 테스트이다.

학습 테스트의 목적은 자신이 사용할 API나 프레임워크의 기능을 테스트로 보면서 사용 방법을 익히려는 것이다. 테스트이지만 프레임워크나 기능에 대한 검증이 목적이 아니다. 자신이 테스트를 만들려고 하는 기술이나 기능에 대해 얼마나 제대로 이해하고 있는지, 그 사용 방법을 바로 알고 있는지를 검증하려는 게 목적이다. 또, 테스트 코드를 작성해보면서 빠르고 정확하게 사용법을 익히는 것도 학습 테스트를 작성하는 하나의 목적이다.

학습 테스트의 장점

  • 다양한 조건에 따른 기능을 손쉽게 확인해볼 수 있다

    • 학습 테스트는 자동화된 테스트 코드로 만들어지기 때문에 다양한 조건에 따라 기능이 어떻게 동작하는지 빠르게 확인할 수 있다.
  • 학습 테스트 코드를 개발 중에 참고할 수 있다

    • 학습 테스트는 다양한 기능과 조건에 대한 테스트 코드를 개별적으로 만들고 남겨둘 수 있다.
    • 실제 개발에서 샘플 코드로 참고할 수 있다
  • 프레임워크나 제품을 업그레이드할 때 호환성 검증을 도와준다

  • 테스트 작성에 대한 좋은 훈련이 된다

  • 새로운 기술을 공부하는 과정이 즐거워진다

버그 테스트

코드에 오류가 있을 때 그 오류를 가장 잘 드러내줄 수 있는 테스트

버그 테스트의 장점

  • 테스트의 완성도를 높여준다

    • 기존 테스트에서 불충분한 부분이 있었기 때문에 버그가 발생한 것이다. 이에 대해 테스트를 만들기 때문에 테스트를 보완해줄 수 있다.
  • 버그의 내용을 명확하게 분석하게 해준다

  • 기술적인 문제를 해결하는 데 도움이 된다

동등분할(equivalence partitioning)

같은 결과를 내는 값의 범위를 구분해서 각 대표 값으로 테스트를 하는 방법을 말한다.

경계값 분석(boundary value analysis)

에러는 동등분할 범위의 경계에서 주로 많이 발생한다는 특징을 이용해서 경계의 근처에 있는 값을 이용해 테스트하는 방법

참고

  • 토비의 스프링 3.1 Vol. 1 스프링의 이해와 원리
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함