번역서 정보 | 문서 창고 | 자유 게시판 | 방명록

영어가 싫은 C++ 프로그래머를 위한 GoogleTest 해킹

류광, 2009/03/01 19:01
GoogleTest 프레임워크에서 검례 이름을 한글로 적을 수 있게 하는 요령 하나.

주의: 아래의 해킹은 제가 Visual C++ 2008 Express에서 기본적인 형태의 검례 몇 개로만 시험해 본 것입니다. 모든 경우에 잘 작동하리라는 보장은 없습니다.

그리고 이 해킹은 __LINE__ 매크로에 의존하므로, 검례들이 여러 개의 소스 파일들에 나뉘어 있는 경우 충돌이 생길 가능성이 있습니다. 이 부분에 대한 해결책은 찾지 못했습니다. (__COUNTER__ 같은 것이 표준이 된다고 해도, 개별 번역 단위마다 카운터가 초기화된다면 무용지물입니다...)

각설하고, 코드 나갑니다~

#include <gtest/gtest.h>

// --- 이겁니다 ----
#define DO_CONCAT(a, b) a ## b
#define CONCAT(a, b) DO_CONCAT(a, b)

#undef GTEST_TEST_CLASS_NAME_
#define GTEST_TEST_CLASS_NAME_(a, b) CONCAT(TestCase_, __LINE__)
// --- 여기까지 ----

int gcd(int m, int n)  { return 2; }

TEST("gcd 함수 검사", "입력들이 음수인 경우")
{
  EXPECT_EQ(2, gcd(-4, -10));
}

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

  return RUN_ALL_TESTS();
}

기존 매크로들을 건드리는 게 꺼림칙하다면 다음처럼 개별적인 매크로들을 등록해서 사용해도 됩니다. (다음 코드의 대부분은 gtest_internal.h 에서 가져온 것이므로, GoogleTest의 저작권 및 사용조건이 그대로 적용됩니다.)

gtest_hack.h

#ifndef GOOLE_TEST_HACK_GOOGLETEST_K_H
#define GOOLE_TEST_HACK_GOOGLETEST_K_H

#define DO_CONCAT(a, b) a ## b
#define CONCAT(a, b) DO_CONCAT(a, b)

// 고유한 식별자를 얻기 위해 __LINE__을 사용
#define K_TEST_CLASS_NAME_() CONCAT(TestCase_, __LINE__)

// gtest_internal.h에서 뽑았음.
#define K_TEST_(test_case_name, test_name, parent_class, parent_id)\
class K_TEST_CLASS_NAME_() : public parent_class {\
 public:\
  K_TEST_CLASS_NAME_()() {}\
 private:\
  virtual void TestBody();\
  static ::testing::TestInfo* const test_info_;\
  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
      K_TEST_CLASS_NAME_());\
};\
\
::testing::TestInfo* const K_TEST_CLASS_NAME_()\
  ::test_info_ =\
    ::testing::internal::MakeAndRegisterTestInfo(\
      #test_case_name, #test_name, "", "", \
      (parent_id), \
      parent_class::SetUpTestCase, \
      parent_class::TearDownTestCase, \
      new ::testing::internal::TestFactoryImpl<\
         K_TEST_CLASS_NAME_()>);\
void K_TEST_CLASS_NAME_()::TestBody()

#define kTEST(test_case_name, test_name)\
  K_TEST_(test_case_name, test_name,\
      ::testing::Test, ::testing::internal::GetTestTypeId())

#define kTEST_F(test_fixture, test_name)\
  K_TEST_(test_fixture, test_name, test_fixture,\
      ::testing::internal::GetTypeId<test_fixture>())
#endif // GOOLE_TEST_HACK_GOOGLETEST_K_H

소스 파일에서 #include <gtest/gtest.h> 다음에 #include "gtest_hack.h" 추가하고, TEST와 TEST_F 대신 kTEST와 kTEST_F 를 사용해서 검례들을 작성하면 됩니다.

top
TAG

Trackback Address :: http://occamsrazr.net/tt/trackback/212

  1. hermian 2009/03/02 07:40 PERMALINKMODIFY/DELETE REPLY

    혹 g++에서 사용하는 방법은 없는지요?




  2. 류광 2009/03/02 17:10 PERMALINKMODIFY/DELETE REPLY

    g++에서 안 될 이유는 없는데 한 번 해보시고 알려주세요~




  3. 너구리 2009/05/19 14:54 PERMALINKMODIFY/DELETE REPLY

    스샷에 있는 마우스 보고 마우스 왜 안 움직이나 한참 찾았어요...-_-;;;



  4. 류광 2009/05/22 23:09 PERMALINKMODIFY/DELETE REPLY

    석세스!


Write a comment


◀ PREV : [1] : ... [11] : [12] : [13] : [14] : [15] : [16] : [17] : [18] : [19] : ... [198] : NEXT ▶