E D R , A S I H C RSS

UnitTest (rev. 1.1)

Unit Test

해당 실행 기능이 제대로 돌아가는지를 테스트하는 코드. 보통 SE에서는 모듈단위의 테스트를 지칭한다.

ExtremeProgramming 에서는 TestFirstProgramming 을 한다. TestFirstProgramming 에서는 해당 기능에 대한 테스트 프로그램을 먼저 만들고, 실제 프로그래밍을 한다.

TestFirstProgramming 을 하게 되면 해당 프로그램을 작성해 나가는 과정이 UnitTest 작성중 남게 된다. 이는 일종의 WhiteBoxTesting 이 된다. 또한, 해당 모듈이 제대로 돌아가는지에 대한 결과도 체크하므로 BlackBoxTesting 의 역할을 한다. 즉, ExtremeProgramming 에서의 UnitTest 는 두가지 테스트의 성격을 같이 포함하고 있다. (Gray Box Testing)

보통 테스트 코드를 작성할때는 UnitTestFramework Library들을 이용한다. 각 Language 별로 다양한데, C++ 사용자는 CppUnit, Java 는 JUnit, Python 은 PyUnit 등을 이용할 수 있다. PyUnit 의 경우는 2.1부터 기본 모듈에 포함되어있다.


SoftwareEngineering 에 있어서 UnitTest 는 '단위 모듈에 대한 테스트' 이다. 즉, 해당 기능이 제대로 돌아감을 확인하는 테스트가 UnitTest 이다.

우리는 실제로 프로그래밍을 하는 중간중간에 결과값을 출력해봄으로서 제대로 돌아감을 확인한다. 이 또한 UnitTest 라 할 수 있겠다. (단, Manual Test 로 분류해야 하겠다.) 올바른 결과값인지 확인하는 과정을 코드로서 만들어 넣는다면 이 테스트는 자동화시킬수 있을 것이다.

예를 든다면, 다음과 같은 것이 UnitTest Code 가 될 수 있겠다.
void testFactorial ()
{
	expected = 3 * 2 * 1;
	actual = factorial (3);
	if (expected == actual) printf ("okok!\n");
	else printf ("error!\n");
}

이를 assert 문으로 바꾸면 다음과 같이 가능하다. 결과값이 같지 않으면 'abnormal program termination' 이 일어난다.
 
void testFactorial ()
{
	expected = 3 * 2 * 1;
	actual = factorial (3);
	assert (actual == expected);
}
C 에서의 UnitTest Code 작성시에는 assert 문으로 비슷한 기능을 구현 할 수 있다.


Thread

Q: 한가지 의문나는 점이 있어서 , 사용자가 임의로 생성할 수 없는(예를들면 Socket과 같은 시스템이 생성해주는 데이타 타입) 데이타 형이 파라미터로 있을 때는 어떻게 테스트 하는 것이 좋을까요?

A: Socket 이나 Database를 이용하는 경우에는 문제가 되겠죠. 그럴때 MockObjects를 이용하는 방법이 있었던걸로 기억하는데, 아직 실제로 제가 해보지는 않아서요. 대강 개념을 보면 MockObjects는 일종의 가짜 객체로 실제 객체가 하는 일을 시뮬레이션 해주는 객체입니다. 미리 MockObjects 를 셋팅을 해두고 해당 함수결과의 리턴 요구시에는 예측할 수 있는 데이터를 리턴하게끔 하는 것이지요. 나중에 본 프로그램에서 MockObjects들을 토대로 실제의 객체를 만든다.. 식의 개념으로 기억하고 있긴 한데, 저의 경우는 공부만 하고 적용해본 적은 없습니다. --석천

A: MockObjects가 최적입니다. Socket이나 Database Connection과 동일한 인터페이스의 "가짜 객체"를 만들어 내는 겁니다. 그러면 Socket 에러 같은 것도 임의로 만들어 낼 수 있고, 전체 테스팅 시간도 훨씬 짧아집니다. 하지만 "진짜 객체"를 통한 테스트도 중요합니다. 따라서, Socket 연결이 제대로 되는가 하는 정도만(최소한도로) "진짜 객체"로 테스팅을 하고 나머지는 "가짜 객체"로 테스팅을 대체할 수 있습니다. 사실 이런 경우, MockObjects를 쓰지 않으면 Test Code Cycle을 통한 개발은 거의 현실성이 없거나 매우 비효율적입니다. --김창준

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:20
Processing time 0.0229 sec