티스토리 뷰

2장 테스트

IoC, DI, Test

  • 스프링의 핵심인 IoC와 DI는 오브젝트의 설계와 생성, 관계, 사용에 관한 기술
    • 객체지향 프로그래밍 언어의 근본과 가치를 개발자가 손쉽게 적용할 수 있다
  • 테스트는 만들어진 코드를 확신할 수 있게 하고, 변화에 유연하게 대처할 수 있게한다

테스트의 유용성

  • 테스트는 내가 예상하고 의도했던 대로 코드가 정확히 돌아가는 지 확인하여, 코드에 확신을 가질 수 있게 하는 작업
  • 웹 개발에서 테스트를 진행하면, 데이터가 웹 화면에 보여지기까지 개발을 진행해야한다
    • 하지만 이러한 테스트는 시간도 오래 걸릴 뿐더러
    • 테스트의 실패 원인이 테스트 대상에 있다는 보장도 없다.
    • 따라서 단위 테스트를 진행해야한다

단위 테스트

  • 작은 단위의 코드에 대해 테스트를 수행하는 것을 단위 테스트라고한다.
  • 테스트는 가능하면 작은 단위로 쪼개서 집중해야한다.
  • 테스트의 관심이 다르면 테스트할 대상을 분리하고 집중해서 접근해야한다.
  • 사용자가 직접 테스트를 실행하고, 콘솔에 나온 값을 직접 보며 비교하면 시간도 오래걸릴 뿐더러 확인을 잘못하고 넘어갈 수도 있다. 따라서 테스트 검증의 자동화가 필요하다

테스트 습관

  • 테스트를 성의 없이 만드는 것은 위험하다. 한 가지 결과만 검증하고 넘어가지 말고 꼼꼼하게 테스트를 진행해야한다
  • '항상 네거티브 테스트를 먼저 만들어야 한다' 사람은 테스트를 작성 코드를 작성할 때 실패하는 경우를 교묘하게 피해가는 습성이 있기 때문이다.

TDD

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

  • 테스트를 빼먹지 않고 꼼꼼하게 만들어낼 수 있다
  • 테스트를 자겅하는 시간과 애플리케이션 코드를 작성하는 시간의 간격이 짧아진다
  • 오류를 빨리 발견하여 쉽게 대응할 수 있다

JUit이 테스트를 수행하는 방식

  1. 테스트 클래스에서 @Test가 붙은 public이고 void형이며 파라미터가 없는 테스트 메소드를 모두 찾는다.
  2. 테스트 클래스의 오브젝트를 하나 만든다
  3. @BeforeEach(JUit5 기준)가 붙은 메소드가 있으면 실행한다.
  4. @Test가 붙은 메소드 하나 호출하고 테스트 결과를 저장해둔다
  5. @AfterEach가 붙은 메소드가 있으면 실행한다
  6. 나머지 테스트 메소드에 대해 2 ~ 5번을 반복한다
  7. 모든 테스트의 결과를 종합해서 돌려준다

JUnit은 각 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 확실하게 보장 하기 위해서 매번 새로운 Test 오브젝트를 생성하도록 하였다.

스프링 테스트

@SpringJUnitCofig 어노테이션을 사용하면 ApplicationContext@Autowired를 사용하여 자동 주입이 가능하다. 이는 스프링 애플리케이션 컨텍스트는 초기화할 때 자기 자신도 빈으로 등록한다. 따라서 애플리케이션 컨텍스트 에는 ApplicationContext 타입의 빈이 존재하여 DI가 가능해진다.

동일한 타입의 빈이 두 개있을 떄

@Autowired는 타입으로 가져 올 빈을 선택할 수 없을 때 변수의 이름과 같은 이름의 빈이 있는지 확인한다. 따라서 DataSource 타입의 빈 dataSource, dataSource2가 있으면 전자가 주입된다.

@Autowired
DataSource dataSource;

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

침투적 기술은 기술을 적용했을 때 애플리케이션 코드에 기술 관련 API가 등장하거나, 특정 인터페이스나 클래스를 사용하도록 강제하는 기술을 말한다. 침투적 기술을 사용하면 애플리케이션 코드가 해당 기술에 종속된다.

비침투적인 기술은 애플리케이션 로직은 담은 코드에 아무런 영향을 주지 않고 적용이 가능하다. 따라서 기술에 종속적이지 않은 순수한 코드를 유지할 수 있게 해준다.

학습 테스트

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

학습 테스트의 목적은 테스트 대상 기술 혹은 기능을 얼마나 이해하고 있는 지, 사용 방법은 제대로 알고있는지를 검증하기 위함이다.

버그 테스트

코드에 오류가 있을 때 그 오류를 가장 잘 드러내줄 수 있는 테스트를 말한다. 버그 테스트는 일단 실패하도록 만들어야 한다. 그러고 나서 버그 테스트가 성공할 수 있도록 애플리케이션 코드를 수정한다. 테스트가 성공하면 버그가 해결된 것이다.

버그 테스트의 필요성과 장점

  • 테스트의 완성도를 높여준다
  • 버그의 내용을 명확하게 분석하게 해준다
  • 기술적인 문제를 해결하는 데 도움이된다

동등 분할

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

경계값 분석

경계의 근처에 있는 값을 이용해 테스트하는 방법이다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함