Home 테스트 코드
Post
Cancel

테스트 코드

테스트 코드란?

프로그래밍에서 테스트

프로그래밍에서 테스트(Test)란, 개발한 소프트웨어가 제대로 동작하는지 확인하고, 버그와 결함을 발견하고 수정하는 과정을 말합니다.

소프트웨어를 개발할 때, 개발자는 예상치 못한 문제나 오류를 최소화하기 위해 다양한 테스트를 수행합니다.

프로그래밍에서 테스트는 소프트웨어 개발의 핵심 요소 중 하나이며, 품질과 안정성을 보장하는 데 매우 중요한 역할을 합니다.

테스트 코드

테스트 코드(Test Code)는 소프트웨어 개발에서 테스트에 사용되는 코드로, 소프트웨어의 기능이나 성능 등을 검증하는 것을 목적으로 작성된 코드입니다.

일반적으로 테스트 코드는 소프트웨어의 다양한 기능들을 테스트하는데 사용되며, 각 부분이 기대한 대로 동작하는지 확인하고, 예상치 못한 오류나 버그를 찾아내서 이를 수정하는 데 도움을 줍니다. 또한, 테스트 코드를 작성함으로써 코드의 가독성과 유지보수성을 향상시키며, 코드의 품질을 개선할 수 있습니다.

테스트 코드는 자동화된 단위 테스트, 통합 테스트, 인수 테스트 등의 다양한 종류로 구성될 수 있습니다. 이러한 테스트는 소프트웨어의 안정성과 신뢰성을 보장하기 위한 중요한 요소이며, 개발자들은 소프트웨어의 각각의 부분을 분리된 단위로 테스트하고, 이를 통해 버그를 발견하고 수정함으로써 최종적으로 안정적이고 효율적인 소프트웨어를 개발할 수 있습니다.

테스트 코드를 작성해야 하는 이유

깨끗한 코드란? [클린코드]

깨끗한 코드는 작성자가 아닌 사람도 읽기 쉽고 고치기 쉽다. 단위 테스트와 인수 테스트 케이스가 존재한다. [데이브 토마스(Deve Thomas, OTI 창립자이자 이클립스 전략의 대부)]

모든 테스트를 통과한다. 중복이 없다. 시스템 내 모든 설계 아이디어를 표현한다. 클래스 메서드 함수 등을 최대한 줄인다. [론 제츠리스(Ron Jeffries, Extreme Programming Installed와 Extreme Programming Adventure in c# 저자)]

  1. 버그를 발견하고 수정할 수 있습니다.
    테스트 코드를 작성하면 코드에 버그가 있는지 빠르게 발견하고 수정할 수 있습니다. 버그를 빠르게 찾아내면 수정하는 데 드는 비용이 크게 줄어들며, 소프트웨어의 안정성과 신뢰성이 향상됩니다.

  2. 코드의 예상 동작을 검증할 수 있습니다.
    테스트 코드를 작성하면 코드의 예상 동작을 검증할 수 있습니다. 예상하지 못한 결과가 발생하는 것을 방지할 수 있으며, 코드의 품질을 향상시킬 수 있습니다.

  3. 코드 변경 시 기존 기능이 영향을 받는지 확인할 수 있습니다.
    새로운 기능을 추가하거나 기존 코드를 수정할 때, 기존 기능에 영향을 미치는지 확인하는 것이 중요합니다. 테스트 코드를 작성하면 기존 코드에 영향을 미치는 변경 사항을 빠르게 발견할 수 있으며, 변경 사항에 대한 검증을 수행할 수 있습니다.

  4. 코드 리팩토링을 지원합니다.
    코드 리팩토링은 코드의 구조를 개선하고 유지보수를 용이하게 하는 것을 말합니다. 테스트 코드를 작성하면 코드 리팩토링을 보다 쉽게 할 수 있습니다. 코드 리팩토링을 수행하더라도 코드의 기능이 영향을 받지 않도록 테스트 코드를 작성하여 코드의 안정성을 보장할 수 있습니다.

  5. 자동화된 테스트를 가능하게 합니다.
    테스트 코드를 작성하면 자동화된 테스트를 수행할 수 있습니다. 자동화된 테스트를 수행하면 테스트를 빠르게 실행할 수 있으며, 버그를 빠르게 발견하고 수정할 수 있습니다.

  6. 개발 생산성을 높입니다.
    테스트 코드를 작성하면 버그를 빠르게 발견하고 수정할 수 있으므로, 개발 생산성을 높일 수 있습니다. 또한, 테스트 코드를 작성하면 기능 구현 시간보다 품질을 더 중요시 여기는 개발 문화를 만들 수 있습니다.

테스트 코드 종류

Test Pyramid
Test Pyramid [Martin Fowler, https://martinfowler.com/bliki/TestPyramid.html]

  1. 단위 테스트(Unit Test)
    • 응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트입니다.
    • 개발한 코드의 각각의 기능을 테스트합니다.
    • 이를 통해 각각의 코드 블록이 올바르게 작동하며, 예상치 못한 오류나 버그가 없는지 확인합니다.
  2. 통합 테스트(Integration Test, Service Test)
    • 단위 테스트가 통과한 코드 블록들을 하나로 통합하여 전체 시스템이 올바르게 작동하는지 확인하는 것입니다.
    • 통합 테스트는 단위 테스트와 달리 개발자가 변경할 수 없는 부분(ex. 외부 라이브러리)까지 묶어 검증할 때 사용한다.
  3. 인수 테스트(Acceptance Test, End to end Test, UI Test)
    • 소프트웨어가 사용자의 요구 사항을 충족하는지 확인하는 것입니다.
    • 앞선 두 테스트들과 달리 비즈니스 쪽에 초점을 둔다.

단위 테스트 5원칙 - F.I.R.S.T [클린코드, Martin Fowler]

  1. Fast: 빠르게
    • 테스트는 빨라야 한다.
    • 테스트가 느리면 자주 돌릴 엄두를 못 낸다.
    • 자주 돌리지 않으면 초반에 분제를 찾아내 고치지 못한다.
  2. Independent: 독립적으로
    • 각 테스트는 서로 의존하면 안 된다.
    • 테스트가 서로에게 의존하면 하나가 실패할 때 나머지도 잇달아 실패하므로 원인을 진단하기 어려워지며 후반 테스트가 찾아내야 할 결함이 숨겨진다.
  3. Repeatable: 반복가능 하게
    • 테스트는 어떤 환경에서도 반복 가능해야 한다.
    • 테스트가 돌아가지 않는 환경이 하나라도 있다면 테스트가 실패한 이유를 둘어댈 변명이 생긴다.
    • 게다가 환경이 지원되지 않기에 테스트를 수행하지 못 하는 상황에 직면한다.
  4. Self-validating: 자가검증하는
    • 테스트는 부울(bool) 값으로 결과를 내야 한다.
    • 테스트가 스스로 성공과 실패를 가늠하지 않는다면 판단은 주관적이 되며 지루한 수작업 평가가 필요하게 된다.
  5. Timely: 적시에
    • 테스트는 적시에 작성해야 한다.
    • 단위 테스트는 테스트하여는 실제 코드를 구현하기 직전에 구현한다.

단위 테스트 만들기 실습

This post is licensed under CC BY 4.0 by the author.

asciidoc(adoc)을 markdown(md)로 변환하기 (convert adoc to md)

모듈러 모놀리스 아키텍처(modular monolith architecture)