우리는 왜 소프트웨어 테스트가 필요한 걸까?
앞서 소프트웨어 테스트의 정의와 그 필요성에 대해 알아보았습니다. 이번 포스팅에서는 소프트웨어 테스트에는 크게 어떤 종류가 있고, 또 구체적으로 단위테스트와 이를 수행하기 위한 ‘jUnit’이라는 강력한 테스트 프레임워크에 대해서 알아볼까 합니다.
1. 흑과 백, 테스트의 분류
소프트웨어 테스트는 요구사항 테스트의 기능 검증에서부터 보안 또는 성능 테스트에 이르기까지 주어진 시스템 범위에서 수행됩니다. 이러한 테스트 타입은 기본적으로 두 개의 주요 카테고리로 분류할 수 있으며 바로 블랙박스 테스트와 화이트박스 테스트입니다.
[블랙박스 테스트, 화이트박스 테스트]
- 블랙박스 테스트(Black-box Test)는 시스템을 하나의 블랙박스로 간주하고 소프트웨어 동작을 검사하는 방법입니다. 주로 올바른 입력과 올바르지 않은 입력을 모두 동원하여 올바른 출력을 판별하는 방식으로 검사가 이루어지기 때문에 검사 대상이 되는 소프트웨어의 내부 구조나 코드 등에 대한 정보는 필요로 하지 않는 것이 특징입니다. ‘이 소프트웨어는 무슨 역할을 수행해야 되는가’와 같이 소프트웨어의 요구사항에 초점을 맞춰 검사가 이루어집니다. 따라서 기능테스트라고도 합니다.
- 화이트박스 테스트(White-box Test)는 소프트웨어의 내부 테스트를 포함하여 단위테스트, 코드 커버리지 테스트 등이 있습니다. 내부 코드 테스트이기 때문에 테스트 시에는 작업된 코드와 설계에 관련된 지식을 반드시 알고 있어야 합니다. 테스트는 개별적으로 실행할 수는 있지만, 주된 목적은 전체적인 기능 요구사항을 성공적으로 만족하는지 검증하기 위함입니다.
이 외에 블랙박스 테스트와 화이트박스 테스트가 혼합된 형태인 그레이박스 테스트로도 분류가 가능합니다. 그레이박스 테스트는 내부 구조의 일부만을 알고 있어 테스트 케이스를 작성할 때에는 내부 구조 정보를 활용하며, 테스트는 블랙박스 형태로 수행되는 것이 특징입니다. 사용자 인터페이스 또는 블랙박스 테스트로는 모든 결함을 찾을 수 없을 때, 테스트 효과를 높이는 방안으로 그레이박스 테스트를 수행합니다.
2. 단위테스트(Unit Test)란?
단위테스트는 함수 레벨에서 특정 부분의 동작을 검증하는 것입니다. 개발자가 직접 작성하기 때문에 테스트 대상의 동작을 자세히 알고 있는 상태로 작성하게 됩니다. 또 여러 측면으로 테스트를 해야 하기 때문에 실행 시점의 코드 구석구석까지 커버할 수 있습니다. 단위테스트 하나만으로 소프트웨어를 전체 검증할 수 없습니다. 하지만 구성요소 하나하나를 확실하게 만들 수 있습니다. 구성요소들이 확실해 지면 전체적인 결함, 시간, 비용, 위험 부담을 줄일 수 있습니다. 특히 앞으로 변경할 코드는 문제가 없다는 확신을 갖는 것이 단위테스트의 궁극적인 목표입니다.
3. 매우 강력한 테스트 프레임 워크 ‘JUnit’
[현재는 JUnit 5.3.1 버전이 출시되었음 (2018-11-20 기준)]
‘JUnit’이란 자바 기반 단위 테스트 프레임워크입니다. 자바의 단위테스트에서 빼놓고 이야기할 수 없는 절대적인 위치를 차지하고 있습니다. 사실 자바만 단위 테스팅 프레임워크가 존재하는 것이 아니고, 다양한 언어들도 단위 테스트를 위한 프레임워크가 존재하며 이를 ‘xUnit’이라 칭합니다. xUnit이라는 단위 테스팅 프레임워크의 주된 장점은 같은 테스트 코드를 여러 번 작성하지 않게 해주고, 그 결과가 어떠해야 하는지를 기억할 필요가 없게 하는 자동화된 해법을 제공한다는 것입니다. 뿐만 아니라 xUnit을 통해 테스트가 진행되면 안심하고 코드를 리팩토링할 수 있어 코드의 유지보수가 용이해질 뿐만 아니라 전체적인 프로그래밍 시간도 단축시키는 효과를 얻을 수 있습니다.
언어 | xUnit |
C | CUnit |
C++ | CppUnit |
JavaScript | JSUnit |
PHP | PHPUnit |
Python | PyUnit |
.NET | NUnit |
[다양한 언어에 따른 xUnit 종류]
4. ‘JUnit’의 특징
JUnit의 경우 외부 프로그램을 통해 따로 테스트 케이스를 작성하기 때문에 System.out 등을 이용한 디버깅 등 번거로운 작업이 필요 없습니다. Assert와 같은 단정문으로 쉬운 테스트 케이스 작성이 가능합니다. (참고 http://junit.sourceforge.net/javadoc/org/junit/Assert.html ) 또한 디버깅 범위를 단위 안으로 제한함으로써 이에 들어가는 노고를 크게 줄여주며, 어노테이션(@)으로 간결한 케이스 작성이 가능하여 테스트 시 소요되는 시간도 관리할 수 있게 해줍니다. 뿐만 아니라 JUnit 위에서 동작하여 각각의 목적에 맞게 테스트를 수행할 수 있도록 해주는 다양한 프레임워크도 존재합니다. 대표적인 것으로는 쾌속으로 안드로이드 테스트를 수행하는 ‘Robolectric’과 가짜 객체를 활용하여 여러 상속된 클래스들의 테스트를 수월하게 만들어주는 ‘Mockito’ 등이 있습니다.
5. 마치며
지금까지 소프트웨어 테스트를 크게 두 가지로 분류하는 방식과 단위테스트, 또 그 단위테스트를 위한 ‘Junit’이라는 강력한 테스트 프레임워크에 대해 알아보는 시간을 가졌습니다. 아직까지는 테스트 관련하여 깊은 내용은 아니지만 단위테스트와 Junit이 생소하신 분들께 조금이나마 도움이 되셨으면 좋겠습니다.
-출처-
엘프리드 더스틴&톰 캐럿&버니 가우프 저, 소프트웨어 자동화 구축과 6가지 핵심활동
참고 웹 사이트: http://www.swtestacademy.com/junit-listeners/
참고 웹 사이트: https://junit.org/junit4/