인프런

테스트의 필요성과 테스트 3분류

date
Jan 18, 2025
slug
test-on-spring-with-architecture-2-3
status
Public
tags
테스트를 추가하고 싶은 개발자들의 오답노트
author
summary
테스트의 필요성에 대해 같이 공감해보고 3분류에 대해 알아보자
type
Post
thumbnail
updatedAt
Jan 18, 2025 04:56 AM
category
인프런

📝 강의 정리


[1]. 테스트의 필요성


Legacy Code

  • 오늘 만족스럽게 짠 코드가 다음에 봤을 때 마음에 안드는 경우가 잦다.
    • 이처럼 어제 짠 코드라고 해도 테스트가 없다면 레거시 코드라고 볼 수 있다.

Regression

  • 정상적으로 동작하던 서비스가 배포 이후 동작을 안하는 경우
  • 프로젝트에 새로 합류했을 때, 내 코드가 다른 코드에 영향을 줄 수 있다는 압박감
    • → 이들이 모여 수정과 배포가 무서워지게 된다. 😇

좋은 아키텍처를 유도

  • 테스트와 SOLID 원칙
 

[2]. 테스트와 SOLID 원칙


Single Responsibility Principle

하나의 클래스는 하나의 목적만을 수행한다
  • 테스트를 명료하게 작성하려고 노력하면 자연스럽게 따라온다.
 

Open-Close Principle

확장에는 열려 있되, 수정에는 닫혀 있어라
  • 테스트를 작성할 때, 테스트용 컴포넌트와 프로덕션 컴포넌트를 나누어 작업하게 된다.
    • 필요에 따라 컴포넌트를 탈부착이 가능하게 개발하게 되며, 서로에게 영향을 주어선 안된다. 이 과정에서 자연스럽게 OCP를 지키게 된다.
 

Liskov Substitution Principle

부모와 자식 객체가 있을 때, 부모 객체를 호출하는 동작에서 자식 객체가 부모 객체를 완전히 대체할 수 있어야 한다
  • 이상적으로 테스트는 모든 케이스에 대해 커버하고 있다.
    • 따라서, 서브 클래스에 대한 치환 여부를 테스트가 알아서 판단해준다.
 

Interface Sergregation Principle

객체는 자신이 사용하는 메서드에만 의존해야 한다
  • 테스트는 그 자체로 인터페이스를 직접 사용해볼 수 있는 환경이다.
  • 불필요한 의존성을 실제로 확인할 수 있는 샌드박스가 된다.
    • → 테스트를 작성하다 보면 불필요한 의존성이 보이게 된다.
 
🤔 ” 인터페이스가 너무 많아서 뭘 호출해야 할지 모르겠을 때”
→ 인터페이스를 분리해줘야 하는 시점
 

Dependency Inversion Principle


추상화에 의존하되, 구체화에 의존하면 안 된다
  • 추후에 자세히 기술
 

[3]. 테스트의 3분류


notion image

소형 테스트( Unit 테스트 )


소형 테스트는 아래 조건들로 인해 결과가 결정적이고 속도가 빠르다.
  • 단일 서버
  • 단일 프로세스
  • 단일 스레드
  • 디스트 I/O 사용 X
  • Blocking Call X
예제

// MathTest.java @Test void Math_는_정수를_더해_정수를_얻을_수_있다() { // given int a = 10; int b = 20; // when int result = Math.add(a, b); // then assertThat(result).isEqualto(30); }
 

중형 테스트( Integration 테스트 )


h2와 같은 테스트용 DB를 사용할 수 있다.
  • 단일 서버
  • 멀티 프로세스
  • 멀티 스레드
 
❗️h2와 같은 테스트용 DB를 사용한 테스트는 소형 테스트가 아니다.
  • 중형 테스트를 너무 많이 만드는 실수는 스프링 개발자들이 많이 저지르는 실수다. 피라미드를 생각하며 좋은 방향성을 고민하자.
 

대형 테스트( E2E 테스트 )


멀티 서버를 이용한 테스트
  • 멀티 서버
  • End-To-End 테스트
 
 
 

📎 출처