Beizer처럼 아직도 테스트할 수 있나요?
Source: Dev.to
배경 및 초기 질문
누구나 열린 공간에서 이런 질문을 들어본 적이 있을 것이다: “그래, 그런데 네 유닛은 어느 정도 크기야?”
그리고 답은 “작아, 예를 들면… 음…”, 그러다 더 이상 비교할 점이 사라진다.
그 사람도 JUnit, PHPUnit 혹은 다른 프레임워크를 사용한다.
Kent Beck에 의한 단위 테스트 정의
Test‑Driven Development By Example (2003)에서 Kent Beck는 이렇게 적었다:
“작은 규모의 테스트(나는 이를 ‘단위 테스트’라고 부르지만, 일반적으로 받아들여지는 단위 테스트 정의와는 크게 다르다)로 개발을 진행할 때의 문제는, 사용자의 의도를 구현했다고 생각하지만 실제로는 전혀 원하지 않는 것을 구현하게 될 위험이 있다는 것이다.”
Beck는 두 가지 정보를 제공한다:
- “단위 테스트”라는 정의는 실제 업무 세계에 존재한다.
- 그는 전혀 신경 쓰지 않는다; JUnit이라는 이름은 “보고 치우는” 수준이다.
Boris Beizer의 정의
국제 소프트웨어 테스트 자격 위원회(International Software Testing Qualification Board)의 저명한 회원이자 Software Testing Techniques (1983)와 Software System Testing and Quality Assurance (1984)의 저자인 Boris Beizer는 첫 번째 책의 1990년 두 번째 판에서 세 가지 유형의 테스트를 분류하였다.
Beizer에 따른 테스트 유형
| 유형 | 설명 |
|---|---|
| 유닛, 단위 테스트 | 유닛은 소프트웨어에서 테스트 가능한 가장 작은 요소이다: 컴파일·조립·링크·로드가 가능하고 테스트 하네스나 드라이버에 의해 제어될 수 있다. 일반적으로 한 프로그래머가 작업한 수백 줄(또는 그 이하)의 소스 코드로 구성된다. 단위 테스트는 유닛이 기능 사양을 충족하지 않음을 보여주거나 구현 구조가 설계와 일치하지 않음을 확인한다. 발견된 결함은 유닛 버그라고 부른다. |
| 컴포넌트, 컴포넌트 테스트 | 컴포넌트는 하나 이상의 유닛이 통합된 집합이다. 재귀적인 정의에 따라, 컴포넌트는 유닛일 수도, 서브시스템일 수도, 심지어 전체 시스템일 수도 있다. 컴포넌트 테스트는 컴포넌트가 기능 사양을 충족하지 않음을 보여주거나 구현 구조가 기술 설계와 일치하지 않음을 확인한다. 발견된 결함은 컴포넌트 버그라고 부른다. |
| 통합, 통합 테스트 | 통합은 여러 컴포넌트를 결합해 더 큰 컴포넌트를 만드는 과정이다. 통합 테스트는 각각의 컴포넌트가 개별적으로는 만족스러워도, 이들의 조합이 잘못되었거나 호환되지 않을 때 이를 보여준다. |
| 시스템, 시스템 테스트 | 시스템은 “큰 컴포넌트”이다. 시스템 테스트는 개별 컴포넌트에 귀속될 수 없는 이상 현상을 드러낸다. 예를 들어 컴포넌트 간 호환성 문제, 예상치 못한 상호 작용, 성능·보안·구성·시작·복구와 관련된 문제 등이 있다. |
컴포넌트 vs 통합 차이 예시
예시: 재귀적으로 호출되는 서브루틴
A.
- 컴포넌트 테스트는 하위 컴포넌트 호출을 포함하지 않으므로
A의 재귀성은 테스트되지 않는다.- 통합 테스트는
A의 호출과 반환을 테스트하며, 재귀 호출(스택 등)의 지원까지 포함한다. 이처럼 새로 통합된 컴포넌트는 추가적인 테스트가 필요하다.
정의의 영문 원문 (발췌)
“We do three distinct kinds of testing on a typical software system: unit/component testing, integration testing, and system testing. The objectives of each class are different and therefore, we can expect the mix of test methods used to differ.”
Unit, Unit Testing — A unit is the smallest testable piece of software, by which I mean that it can be compiled or assembled, linked, loaded, and put under the control of a test harness or driver. A unit is usually the work of one programmer and consists of several hundred or fewer lines of source code. Unit testing is performed to show that the unit does not satisfy its functional specification and/or that its implemented structure does not match the intended design. When such faults are revealed, we speak of a unit bug.
Component, Component Testing — A component is an integrated aggregate of one or more units. A unit is a component; a component with the subroutines it calls is also a component, etc. By this recursive definition, a component can be anything from a single unit to an entire system. Component testing is performed to show that the component does not satisfy its functional specifications and/or that its implementation structure does not match the technical design. Faults detected are called component bugs.
결론
Beizer는 유닛부터 전체 시스템에 이르는 다양한 테스트 수준을 명확하고 상세하게 분류한다. 그의 이름이 최신 교육 과정에 자주 등장하지는 않지만, 그의 연구는 소프트웨어 품질을 깊이 있게 탐구하고자 하는 모든 사람에게 여전히 귀중한 참고 자료이다. Beizer를 읽는다는 것은 “작은 규모의 테스트” 함정에 빠지지 않도록 견고한 프레임워크를 갖추고, 각 통합 단계가 올바르게 검증되도록 하는 데 큰 도움이 된다.