Unit Testing이란?
Unit Testing은 프로그램의 개별 컴포넌트 또는 단위의 기능을 애플리케이션의 나머지 부분과 격리하여 검증하는 소프트웨어 테스트 기법입니다.
“단위”는 일반적으로 함수, 메서드, 클래스 또는 스크립트와 같이 프로그램에서 테스트 가능한 가장 작은 부분을 의미합니다. 복잡한 스크립트나 알고리즘을 이러한 작은 단위로 나누면 각 컴포넌트의 기능을 검증하기 위한 정밀하고 표적화된 테스트를 개발할 수 있습니다.
Unit Testing이 중요한 이유
개별 단위에 대한 Unit Testing을 조기에 수행하면 오류를 발견하고 수정할 수 있으므로, 코드의 안정성이 높아지고 디버그 프로젝트의 복잡성과 소요 시간이 줄어듭니다. 또한 유지관리가 용이한 모듈식 소프트웨어 개발의 지원을 통해 코드 품질을 개선합니다.
Unit Testing의 이점과 문제
Unit Testing은 다음과 같은 몇 가지 이점을 제공합니다.
- 단위 테스트는 전체 시스템 또는 보다 포괄적인 테스트에 비해 작성하기 쉽고 실행 속도가 빠른 경우가 많습니다.
- 초기 단계에서 버그를 식별하고 격리하기가 더 쉬울 수 있습니다.
- 소프트웨어의 다른 부분과 관련된 문제를 식별하여 서브시스템 상호 작용의 수를 최소한으로 유지하도록 할 수 있습니다.
- 전체 애플리케이션이 완성될 때까지 기다리지 않고 초기 개발 단계에서 테스트를 시작할 수 있습니다.
그러나, 개별 단위를 독립적으로 테스트하면 모든 문제를 검출하지 못할 수도 있다는 문제가 있습니다.
Unit Testing을 수행해야 하는 시점
코드 품질을 보장하고 코딩 변경으로 인한 영향을 파악하려면 개발 공정 전반에 걸쳐 Unit Testing을 수행해야 합니다.
- 개발 도중: 새로운 특징의 개발과 함께 단위 테스트를 작성합니다. 이 접근법을 통해 각 컴포넌트가 처음부터 의도한 대로 동작하도록 할 수 있습니다.
- 리팩터링 시: 단위 테스트를 활용하여 리팩터링으로 인해 코드의 예상 동작이 변경되지 않도록 합니다.
- 버그 수정 이후: 해결된 버그에 대한 단위 테스트를 구현하여 향후 재발을 방지하고 수정 사항이 다른 소프트웨어 기능에 부정적인 영향을 미치지 않도록 합니다.
- 통합 이전 및 도중: 변경 사항을 메인 코드에 병합하고 CI(지속적 통합) 파이프라인에 통합하기 전에 단위 테스트를 수행합니다. 이를 통해 새 코드로 인한 오류 발생을 방지하고 안정적인 코드베이스를 유지할 수 있습니다.
소프트웨어 테스트 피라미드
소프트웨어 개발 프로세스의 초기와 전체에 걸쳐 Unit Testing을 수행하여 더 우수한 코드 품질을 얻을 수 있습니다. 하지만 Unit Testing은 포괄적인 전략의 일부일 뿐입니다. 소프트웨어 테스트 피라미드는 Unit Testing, 통합 테스트, 시스템 테스트 등 다양한 수준의 테스트를 다루며, 이런 테스트의 조밀도 및 실행 빈도를 보여줍니다. 이 피라미드는 테스트 작업을 관리하고 우선순위를 지정하는 구조화된 접근법을 제공하며 최적의 소프트웨어 품질을 달성하는 데 필요한 균형을 강조합니다.
이러한 테스트 유형의 특성은 다음과 같습니다.
- 피라미드의 맨 아래에 있는 Unit Testing은 가장 조밀하며 가장 빈번히 실행됩니다. 단위 테스트는 일반적으로 규모가 작기 때문에 작성 및 실행 속도가 더 빠르고 비용 효율적입니다. 개발 공정의 초기에 구현할 수 있으며 개별 컴포넌트의 기능에 대한 즉각적인 피드백을 제공합니다.
- 피라미드의 중간에 있는 통합 테스트는 서로 다른 컴포넌트 또는 시스템 간의 상호 작용을 검증하는 데 중점을 둡니다. 통합 테스트는 단위 테스트보다 약간 더 복잡하고 시간이 많이 소요되지만, 통합된 컴포넌트가 예상대로 함께 기능하는지 확인하는 데 있어 매우 중요합니다.
- 피라미드의 맨 위에 있는 시스템 테스트는 전체 애플리케이션을 평가합니다. 시스템 테스트는 더 포괄적이고 자원 집약적입니다. 일반적으로 전체 시스템이 명시된 요구사항을 충족하는지 검증하기 위해 개발 사이클 후반에 수행됩니다.
피라미드는 단위 테스트와 같은 하위수준 테스트를 더 많이 수행하고 상위수준 테스트를 적게 수행하는 것의 중요성을 강조합니다. 균형 잡힌 접근법은 프로젝트 완료 시까지 약 70%의 단위 테스트, 20%의 통합 테스트, 10%의 시스템 테스트를 목표로 합니다. 이 전략은 안정적인 코드의 탄탄한 기반을 보장하여 상위수준 테스트 단계에서 문제가 발생할 가능성을 줄여줍니다.
기타 소프트웨어 테스트 유형
소프트웨어 테스트 피라미드로 표현되는 테스트의 조밀도와 실행 빈도 외에도 여러 유형의 테스트 방법이 있으며, 각 방법은 의도하는 결과에 맞는 특정한 목표를 갖습니다. 한 가지 주요 차이점은 기능 테스트와 비기능 테스트 간에 있습니다.
- 기능 테스트는 소프트웨어의 올바른 기능과 동작을 검증하는 데 중점을 둡니다. 예를 들면, 기본 기능을 검사하는 스모크 테스트와 새로운 코드 변경이 기존 기능에 부정적인 영향을 미치지 않는지 확인하는 회귀 테스트가 있습니다.
- 비기능 테스트는 사용성, 보안성, 안정성과 같은 소프트웨어의 다른 중요한 측면을 평가합니다. 가장 일반적인 비기능 테스트 유형인 성능 테스트는 부하 및 스트레스와 같은 특정 조건에서 소프트웨어가 얼마나 잘 작동하는지를 평가합니다.
기능 테스트와 비기능 테스트를 모두 활용하여 소프트웨어가 올바르게 작동하고 품질 표준을 충족하도록 할 수 있습니다.
MATLAB을 사용한 Unit Testing
코드 테스트는 고품질 소프트웨어 개발에 꼭 필요한 부분입니다. MATLAB®은 Unit Testing을 작성하고 코드 기능의 회귀를 모니터링할 수 있는 내장된 강건한 Unit Testing 프레임워크를 제공합니다. 이 프레임워크는 클래스를 사용한 테스트 작성을 지원하므로 테스트를 논리적으로 구조화할 수 있습니다. 또한, 테스트 결과를 실행하고 분석할 수 있습니다.
클래스 기반 단위 테스트
이 접근법에서는 테스트를 클래스 내의 메서드로 정의합니다. MATLAB을 통해 일반 템플릿을 생성할 수 있으며 MATLAB Test™를 통해 코드에 대한 특정 테스트를 생성할 수 있습니다. 이 접근법을 사용하면 테스트 메서드 내에서 스크립트와 함수를 테스트할 수 있으므로 객체 지향 프로그래밍의 장점과 다양한 코드 유형을 테스트할 수 있는 유연성을 결합할 수 있습니다. 이 예제에서는 클래스 기반 단위 테스트 작성을 다룹니다.
테스트 실행
테스트 파일을 저장한 후 MATLAB 툴스트립에서 테스트를 실행할 수 있습니다. 또한 runtests
함수 또는 MATLAB 테스트 브라우저 앱을 사용해 테스트를 실행하고 결과를 확인하며 실패를 대화형 방식으로 디버그할 수도 있습니다.
테스트 결과 분석
MATLAB은 소스 코드를 분석하기 위한 요약, 상세 리포트 및 코드 커버리지를 제공합니다.
보다 고도화된 기능을 위해 MATLAB Test는 자동화된 테스트 생성, 향상된 테스트 관리, CI/CD 시스템과의 통합, 고급 코드 커버리지, 품질 대시보드 등 테스트 공정을 개선하는 추가 기능을 제공합니다. 테스트 결과 분석에 대해 자세히 알아보세요.
MATLAB에서의 Unit Testing 예제
이 예제는 간단한 fibonacci
함수에 대해 Unit Testing를 수행하는 방법을 보여줍니다. 이 함수는 지정된 수(n)까지 피보나치 수열을 계산합니다. 정확성을 검증하기 위해 샘플 입력을 제공하며, 단위 테스트는 계산된 출력이 주어진 입력에 대한 예상 출력과 일치하는지 검사합니다. 출력이 일치하면 테스트가 통과하고, 그렇지 않으면 실패합니다.
function x = fibonacci (n) % Generate the first n Fibonacci numbers n=6; x = ones (1,n); for ii = 3:n; x(ii) = x(ii - 1) + x(ii - 2); end end
% This is an autogenerated sample test for file fibonacci.m classdef test fibonacci < matlab.unittest.TestCase methods (Test) function test_fibonacci (testCase) % Specify the input (s) of % fibonacci n = 6; % Specify the expected output(s) of % fibonacci expected_x = [1, 1, 2, 3, 5, 8]; % Exercise the function fibonacci actual_x = fibonacci(n); testCase.verifyEqual(actual_x,expected_x); end end end
예제 및 방법
소프트웨어 참조
참조: MATLAB Test, 소프트웨어 테스트