E D R , A S I H C RSS

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.0143 sec