Google Test를 이용한 Class의 Private/Protected Member Test

ref : googletest advance guild

예전에는 Private/Protected member를 Test할때 test main에

#ifdef TEST
#define private public
#define protected public
#endif

이런 코드를 삽입하여 Test 하는 개발자를 보았다.. ㅋ 이럴 경우 #define TEST를 삽입하면 Test 대상이 아닌 모든 class의 접근 권한까지 public이 되어 버리는 상황이 발생한다. 뭐.. 구현과 Test code의 컴파일을 분리하면 별 문제는 되지 않겠지만...대세처럼 되어가는 TDD 방법론의 경우 Test code를 작성하면서 main code를 작성하기 때문에 위와 같은 code는 개발자가 의도하지 않은 실수를 유발하기 딱 좋다 ㅋ

Google Test는 이러한 상황에서 Test code가 다른 프로그램 까지 영향을 미치지 않도록 하는 좋은 방법을 제공한다.

// foo.h
#include "gtest/gtest_prod.h"
// Defines FRIEND_TEST.
class Foo {
  ...
 private:
  FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
  int Bar(void* x);
};
// foo_test.cc
...
TEST(FooTest, BarReturnsZeroOnNull) {
  Foo foo;
  EXPECT_EQ(0, foo.Bar(NULL));
  // Uses Foo's private member Bar().
}

깔끔하다.. FRIEND_TEST는 gtest_prod.h에 정의 되어 있는데 코드를 보면 다음과 같다.

#define FRIEND_TEST(test_cast_name, test_name)\
friend class test_case_name##_##test_name##_Test

friend class FooTest_BarReternsZeroOnNull; 이라는 코드가 삽입되는 것을 알 수 있는데,
google test의 TEST/TEST_F 를 이용하여 만든 Test Case가 실제로는 아래의 규칙대로 만들어진 이름으로 된 class로 각각 정의 되기 때문이다.

#define GTEST_TEST_CLASS_NAME_(test_cast_name, test_name)\
friend class test_case_name##_##test_name##_Test

댓글

이 블로그의 인기 게시물

Raspberry pi 한글 설정 및 chromium 설치