Superkkt Blog

Google C++ Testing Framework

2010/05/12 21:11

Google C++ Testing Framework(이하 gtest)를 사용해서 C++ 코드의 Unit test를 하는 방법을 정리한다.

우선 아래와 같이 간단한 factorial 함수를 만들어서 사용한다.

- factorial.cpp
int factorial(int n)
{
        if (n == 0)
                return 1;

        return n * factorial(n - 1);
}

- factorial.h
#ifndef FACTORIAL_H
#define FACTORIAL_H

int factorial(int n);

#endif


이제 테스트 케이스를 작성하자. 파일명은 일관성을 유지할 수 있도록 모듈 네임 뒤에 '_test'를 붙이도록하자.

- factorial_test.cpp
#include "factorial.h"

#include <gtest/gtest.h>

/* 0을 입력했을 때 결과가 정상적으로 나오는지 테스트 */
TEST(FactorialTest, HandleZero)
{
        EXPECT_EQ(1, factorial(0));
}

/* 임의의 양수값을 입력했을 때 결과가 정상적으로 나오는지 테스트 */
TEST(FactorialTest, HandlePositiveInput)
{
        EXPECT_EQ(1, factorial(1));
        EXPECT_EQ(2, factorial(2));
        EXPECT_EQ(6, factorial(3));
        EXPECT_EQ(40320, factorial(8));
}

int main(int argc, char **argv)
{
        /* gtest 초기화 */
        ::testing::InitGoogleTest(&argc, argv);
         /* 모든 테스트 케이스 실행 */
         return RUN_ALL_TESTS();
}


모든 소스코드를 컴파일하고 테스트 케이스를 실행하면 아래와 같이 정상적으로 실행이 완료된 결과를 확인할 수 있다.


superkkt@superkkt:~/tmp$ g++ -Wall -c factorial.cpp
superkkt@superkkt:~/tmp$ g++ -Wall -o factorial_test factorial_test.cpp factorial.o -lgtest -lpthread
superkkt@superkkt:~/tmp$ ./factorial_test
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from FactorialTest
[ RUN      ] FactorialTest.HandleZero
[       OK ] FactorialTest.HandleZero (0 ms)
[ RUN      ] FactorialTest.HandlePositiveInput
[       OK ] FactorialTest.HandlePositiveInput (0 ms)
[----------] 2 tests from FactorialTest (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (1 ms total)
[  PASSED  ] 2 tests.


이제 factorial 모듈에 버그를 만들어보자. 예를 들어서 아래와 같이 마지막 라인의 곱하기를 더하기로 바꿔보자.

        ...
        return n + factorial(n - 1);

다시 모든 소스코드를 컴파일하고 테스트 케이스를 실행하면 이번에는 양수입력 테스트 과정에서 에러가 발생한다.

superkkt@superkkt:~/tmp$ ./factorial_test
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from FactorialTest
[ RUN      ] FactorialTest.HandleZero
[       OK ] FactorialTest.HandleZero (0 ms)
[ RUN      ] FactorialTest.HandlePositiveInput
factorial_test.cpp:12: Failure
Value of: factorial(1)
  Actual: 2
Expected: 1
factorial_test.cpp:13: Failure
Value of: factorial(2)
  Actual: 4
Expected: 2
factorial_test.cpp:14: Failure
Value of: factorial(3)
  Actual: 7
Expected: 6
factorial_test.cpp:15: Failure
Value of: factorial(8)
  Actual: 37
Expected: 40320
[  FAILED  ] FactorialTest.HandlePositiveInput (1 ms)
[----------] 2 tests from FactorialTest (1 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] FactorialTest.HandlePositiveInput

단순히 에러만 내뿜고 종료되는게 아니라, 어떤 테스트 케이스에서, 예상했던 값은 무엇이였는데, 실제로는 어떠한 값이 반환되었다는 내용들이 출력된다.

더 자세한 사용법은 공식사이트의 위키를 참조한다.


<참조>

http://code.google.com/p/googletest/w/list
http://code.google.com/p/googletest/wiki/GoogleTestPrimer
2010/05/12 21:11 2010/05/12 21:11

trackbacks

trackbacks rss

http://superkkt.com/trackback/512

Leave a Comment