[C++] googletest를 이용한 C++ UnitTest Develop Tip

몇년 전에 파이썬에서 UnitTest를 이용한 단위테스트에 관한 글을 올렸던 적이 있습니다.
C++에서도 유사한 것이 있는가 살펴보았는데,
역시나 구글에서 해 놓았더군요.
GoogleTest 라는 사이트에 가시면 됩니다.

어떤 때는 구글이 개발자의 우상 같다는 생각이 들기도 하고,
어떨 때는 블랙홀 같다는 생각이 들기도 합니다.
기술 개발의 수렴된다는 느낌이 들기 때문이지요.

암튼 이것을 이용해서 이전 파이썬의 UnitTest와 유사한 것을 해 보았습니다.

대신 우분투에서 위에 googletest C++ 라이브러리를 설치하는것이 아주 간단하지는 않았습니다.

# Install googletest
if [ ! -e /usr/local/lib/libgtest.a ];then
wget https://googletest.googlecode.com/files/gtest-1.7.0-rc1.zip
unzip gtest-1.7.0-rc1.zip
pushd gtest-1.7.0
./configure
make
sudo cp -a include/gtest /usr/local/include
sudo cp -a lib/.libs/libgtest.[as]* /usr/local/lib
sudo ldconfig
popd
rm -rf gtest-1.7.0*
fi

위의 내용을 shell파일에 넣어 실행시키시면 됩니다.

이제는 다음과 같은 샘플을 확인해 보겠습니다.


#include "gtest/gtest.h"

namespace {

// The fixture for testing class Foo.
class FooTest : public ::testing::Test {
 protected:
  // You can remove any or all of the following functions if its body
  // is empty.

  FooTest() {
    // You can do set-up work for each test here.
    std::cout << "FooTest()" << std::endl;
  }

  virtual ~FooTest() {
    // You can do clean-up work that doesn't throw exceptions here.
    std::cout << "~FooTest()" << std::endl;
  }

  // If the constructor and destructor are not enough for setting up
  // and cleaning up each test, you can define the following methods:

  virtual void SetUp() {
    // Code here will be called immediately after the constructor (right
    // before each test).
    std::cout << "SetUp()" << std::endl;
  }

  virtual void TearDown() {
    // Code here will be called immediately after each test (right
    // before the destructor).
    std::cout << "TearDown()" << std::endl;
  }

  // Objects declared here can be used by all tests in the test case for Foo.
};

// Tests that the Foo::Bar() method does Abc.
TEST_F(FooTest, MyMethod_0010) {
  // const string input_filepath = "this/package/testdata/myinputfile.dat";
  // const string output_filepath = "this/package/testdata/myoutputfile.dat";
  // Foo f;
  // EXPECT_EQ(0, f.Bar(input_filepath, output_filepath));
  int j = 0;
  ASSERT_EQ(0, j);
}

// Tests that Foo does Xyz.
TEST_F(FooTest, MyMethod_0020) {
  // Exercises the Xyz feature of Foo.
  int j = 1;
  ASSERT_EQ(0, j);
}

}  // namespace

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

그 결과를 돌리면,

$ g++ -o foo foo.cpp -lgtest -lpthread

$ ./foo
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from FooTest
[ RUN      ] FooTest.MyMethod_0010
FooTest()
SetUp()
TearDown()
~FooTest()
[       OK ] FooTest.MyMethod_0010 (0 ms)
[ RUN      ] FooTest.MyMethod_0020
FooTest()
SetUp()
foo.cpp:53: Failure
Value of: j
  Actual: 1
Expected: 0
TearDown()
~FooTest()
[  FAILED  ] FooTest.MyMethod_0020 (0 ms)
[----------] 2 tests from FooTest (0 ms total)

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

 1 FAILED TEST


TEST_F(클래스, 테스트함수명)
으로 원하는 만큼 테스트 함수를 만들면 됩니다.

Setup, TearDown 메소드는 다른 UnitTest와 마찬가지로
매 테스트 함수가 호출되기 전후로 호출됩니다.


어느분께는 도움이 되셨기를...

핑백

  • 지훈현서 : [C++] jsoncpp JSON 라이브러리 2014-05-06 17:15:26 #

    ... dent size "indent" : { "length" : 3, "use_space": true }} 그러면 아래와 같이 테스트 가능합니다. gtest 를 이용했습니다. //============================================================================ ... more

덧글

  • googolhkl 2015/10/24 19:07 # 삭제 답글

    퍼갈께요~
  • 지훈현서아빠 2015/10/25 11:31 #

    네~ 가능하시면 원본을 명시해 주셨으면 좋겠습니다.
    도움이 되셨다면 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트