소프트웨어 프로젝트에서 작성한 프로그램 코드를 철저하게 테스트(test)하는 것은 매우 중요한 일로써 오늘날에서 거의 모든 소프트웨어 프로젝트에서 테스트를 수백 건에서 수천 건 까지 찾아볼 수 있다. 요즘에는 소프트웨어 용 테스트를 작성하는 것은 필수적이며 제대로 테스트를 수행하지 않고 코드나 기능을 전달하면 안된다. 이를 위해 C 또는 C++ 로 작성된 소프트웨어 테스트와 이를 위한 다양한 라이브러리에 대해서 살펴본다.
또한 C/C++ 프로그렘에서 문제 해결을 위해 사용할 수 있는 디버깅 도구 및 기술에 관해서도 살펴본다. 테스트와 디버깅은 처움부터 상호 보완적이며 테스트가 실패할 때마다 이어서 일련의 검사를 수행하고 후속조치로 대상 코드를 디바깅하는 것이 일반적이다.
소프트웨어 테스트는 소프트웨어의 기능적(functional) 요소와 비기능적(non-functional) 요소의 테스트로 구분할 수 있다.
-
기능 테스트(functional test): 기능 요구사항(functional requirement)의 일환으로 정의된 기능을 테스트하는 것으로 함수, 모듈, 컴포넌트, 소프트웨어 시스템과 같은 소프트웨엉 컴포넌트에 대한 특정 입력값에 대해 해댕하는 출력 값을 지정하고 기대한 값이 출력되면 테스트를 통과했다고 판정한다.
-
비기능 테스트(non-functional test): 이 테스트는 일반적으로 메모리 사용량, 완료 시간, 잠금 경합 및 보안 수준과 같은 다양한 항목을 측정하고 함수, 모듈, 컴포넌트, 전체적인 소프트웨어 시스템과 괕은 소프트웨어 컴포넌트가 얼마나 잘 수행되었는지를 평가한다. 측정된 변수가 예상 범위 내에 있을 경우에만 테스트를 통과했다고 판정한다. 이러한 변수에 대한 기대치는 시스템에 대해 정의한 비기능 요구 사항(non-functional requirement)에 기술된다.
기능 및 비기능 테스트와 별도로 테스트 수준(level)은 다르다. 이러한 수준은 독립적인 측면을 포함하는 방식으로 설계된다. 이는 컴포넌트의 크기, 테스트 행위자, 테스트해야하는 기능의 정도에 해당한다. 컴포넌트의 크기는 함수 또는 메소드로 알고 있는 작은 기능에서 부터 소프트웨어 시스템과 같은 큰 부분까지 정의된다.
- 단위 테스트(unit test): 단위의 기능을 테스트한다.
- 통합 테스트(integration test)
- 시스템 테스트(system test)
- 인수 테스트(acceptance test)
- 회귀 테스트(regression test)