테스트 - 단위 테스트(Unit Test)

손지민·2023년 11월 7일

1. 개요

우아한 테크코스 3주차 로또 미션을 진행하며 '도메인 로직단위 테스트를 구현해야 한다.' 라는 요구 사항이 추가되어 단위 테스트에 대해 공부하게 됐습니다.


1.1. 도메인 로직

1.1.1. 개념

  • 도메인 로직이란, 입출력과 같은 UI 로직이 아닌 비즈니스에 중요한 결정을 내리는 역할을 하는 기능을 말한다.
  • 도메인 로직이란 주어진 문제나 업무 영역에서 중요한 부분을 말합니다. 로또 게임의 도메인 로직은 로또 번호를 생성하고 당첨 여부를 확인하는 등 로또 게임에서 중요한 부분을 다루는 핵심적인 비즈니스 로직을 의미합니다. - ChatGpt
  • 예시
    • 로또 게임의 핵심 로직
      • 로또 번호 생성
      • 당첨 번호 생성
      • 번호 일치 확인 및 당첨 결과 결정
      • 수익률 계산
      • 로또 티켓 구매 및 관리
  • 비즈니스 로직과 동의어로 사용됩니다.

    소프트웨어 공학에서 도메인은 소프트웨어가 풀고자하는 현실 세상의 문제를 의미한다.

    예를들어,
    은행 관련 서비스라면, 돈과 관련된 금융 및 은행 업무가 도메인이 된다. 배달 관련 서비스라면 말 그대로 배달이 도메인이 되는 것이다.
    반대로 사용자의 데이터를 어떻게 효율적으로 저장할 것인지, 어떻게 더 빠르게 데이터를 가져올 것인지 같은 기술적인 부분은 도메인과는 분리되어 다뤄진다. 데이터베이스에 연결하고, 백엔드 서버와 통신하고, 사용자와 인터랙션하는 코드들이 필요하다.
    이런 것들은 도메인 로직과 구분지어 어플리케이션 서비스 로직이라고 부른다.
    이거 하나만 기억하면 된다.
    도메인 로직은 현실 문제에 대한 의사결정을 하는 코드다. 나머지 코드는 그 결정을 위한 입력값을 만들어주거나, 그 결정의 결과물을 해석하고 보여주고 전파하는 코드다.

1.1.2. 도메인 로직 분리의 필요성

  • 관심사 분리
  • 도메인 로직과 다른 유형 로직을 구별하는 것은 중요하다고 합니다. 도메인 로직을 명시적으로 구분하고 차별화하면 관심사를 명확하게 분리할 수 있기 때문입니다.
    관심사의 명확한 분리를 통해 우리는 UI 문제 같은 다른 세부 사항에 신경 쓰지 않고 중요 로직에만 집중할 수 있게 됩니다. - 소프트웨어 설계의 근본 원칙, 관심사의 분리

1.1.3.


1.2. 단위테스트

1.2.1. 개념

  • 유닛 테스트는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 즉, 모든 함수와 메소드에 대한 테스트 케이스를 작성하는 절차를 말한다.위키백과
  • 단위 테스트는 앱의 작은 단위(일반적으로 메서드)를 사용하고, 코드의 나머지 부분에서 격리하고, 예상대로 동작하는지 확인합니다. 각 기능 단위가 예상대로 수행되므로 앱 전체에서 오류가 전파되지 않는지 확인하는 것이 목표입니다.MS Learn
  • 단위 테스트는 코드의 '단위', 즉 메서드나 동작 하나를 검증한다. 단위 테스트는 빠르고 작으며 집중적이어야 한다. - 책<필독! 개발자 온보딩 가이드 6장. 154pg>

1.2.2. 필요성

단위 테스트는 소프트웨어 개발에서 매우 중요한 요소입니다. 이러한 테스트는 코드의 각 부분을 개별적으로 검증하는 작업으로, 각 함수, 메서드 또는 모듈이 의도한 대로 작동하는지 확인합니다.

  1. 코드의 신뢰성 확보: 단위 테스트는 코드의 각 부분이 예상대로 동작하는지 확인하여 소프트웨어의 신뢰성을 높입니다.
  2. 버그 식별 및 수정 용이성: 테스트 케이스를 통해 버그를 식별하고 수정하는 과정을 지원하여 소프트웨어의 안정성을 향상시킵니다.
  3. 리팩터링 지원: 코드 리팩터링 과정에서 단위 테스트는 코드 변경 후 기존 기능이 여전히 제대로 작동하는지 확인할 수 있도록 도와줍니다.
  4. 문서화 역할: 단위 테스트는 코드의 사용 방법과 예상 동작을 설명하는 추가적인 문서 역할을 수행합니다.
  5. 개발 속도 향상: 단위 테스트는 개발 초기부터 오류를 발견하고 이를 조기에 수정할 수 있게 해줌으로써 개발 속도를 향상시킵니다.
  6. 재사용 가능한 코드: 테스트 가능한 코드는 종속성이 적고 모듈화되어 있으며, 따라서 다른 프로젝트에서 쉽게 재사용될 수 있습니다.

단위 테스트는 소프트웨어의 안정성과 품질을 향상시키며, 개발자가 코드를 더 자신 있게 유지하고 관리할 수 있도록 도와줍니다.

1.2.3. 좋은 단위 테스트의 규칙

좋은 단위 테스트는 품질이 뛰어나고 유지보수가 용이하며, 코드 변경에 대해 안정적으로 동작하는 테스트를 말합니다. 아래는 좋은 단위 테스트를 작성하기 위한 몇 가지 원칙입니다:

1. 독립성

  • 각 테스트는 서로 독립적이어야 하며, 다른 테스트의 실패에 영향을 받지 않아야 합니다.

2. 반복 가능성

  • 테스트는 어떤 환경에서도 반복 가능해야 합니다. 같은 입력에 대해 항상 같은 결과를 반환해야 합니다.

3. 자가검증(Self-Checking)

  • 테스트는 자체적으로 검증이 가능해야 합니다. 예상 결과와 실제 결과를 비교하여 자동으로 검증할 수 있어야 합니다.

4. 테스트 범위

  • 테스트는 하나의 단일 기능 또는 모듈을 테스트해야 합니다. 하나의 테스트 케이스에는 하나의 목적이 있어야 합니다.

5. 가독성

  • 테스트 코드는 가독성이 있어야 합니다. 테스트의 의도가 명확히 드러나야 합니다.

6. 빠르게 실행 가능

  • 테스트는 빠르게 실행되어야 하며, 개발 주기 내에서 빠른 피드백을 제공해야 합니다.

7. 테스트 데이터

  • 필요한 테스트 데이터는 테스트 안에서 생성되거나 제공되어야 합니다. 테스트 간에 데이터 종속성이 최소화되어야 합니다.

8. 경계값 검사

  • 테스트는 경계값과 예외 상황을 검사해야 합니다. 데이터의 유효성, null 값, 최소값 및 최대값 등을 고려해야 합니다.

9. 유연성과 확장성

  • 테스트는 변경에 유연하고 확장 가능해야 합니다. 코드 변경으로 인해 테스트가 쉽게 수정되거나 확장될 수 있어야 합니다.

10. 메인 코드와 유사성

  • 테스트 코드도 메인 코드와 유사한 품질과 표준을 유지해야 합니다. 명확한 네이밍, 모듈화, 불필요한 반복 제거 등이 중요합니다.
    이러한 규칙을 준수하여 작성된 단위 테스트는 코드 변경에 대한 확신을 제공하고, 안정적으로 시스템을 유지할 수 있게 도와줍니다.

참고

profile
Developer

0개의 댓글