xUnit 아키텍처에 기반하고 있고, 다양한 플랫폼을 지원한다. (test vs9.0)
google code 에 있으며 현재 1.3.0이 최신 버전이다. unittest++, boost test ... 등등 많은 것들이 있지만, Junit 같이 쓰기 편한 것은 c++에서(reflection 이 없어서..ㅠㅠ) 찾기는 힘든거 같고, 그나마 그중에 google test(New BSD License)가 좋았다. 문서화도 잘 되어 있는 편이며, 예제도 많다. 특히 google mock 와 같이 사용하면 정말 좋다.(요건 다음에...)
간단하게 사용법을 알아보자.
TEST(ExampleCase, TestVector)
{
........
ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";
for (int i = 0; i < x.size(); ++i)
{
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}
}
TEST 매크로를 이용하면 하나의 TestCase를 쉽게 만들수 있다.
첫번째 인자(ExampleCase)는 TestCase 이름이고, 두번째 인자(TestVector)는 TestMethod 이름이 된다.
나중에 --gtest_filter를 사용해서 TestCase별로 모을때 편리하고, 다음에 나오지만 TestCase, TestMethod 별로 SetUp, TearDown을 설정 할 수도 있다.
단정문은 prefix로 ASSERT_*, EXPECT_* 가 있다.
ASSERT_* : 단정문이 실패하면 이후의 test method는 무시하고 마친다.
EXPECT_* : 단정문이 실패하더라도 error를 출력하고 이후의 test method를 모두 수행한다.
*_EQ 이외에도 *_TRUE, *_FALSE, *_NE, *_LT, *_GT .... 이 있다. ( google test wiki )
단정문 뒤에 << 은 단정문의 조건이 실패시 사용자가 원하는 문자열을 출력하도록 설정할 수 있다.
TestCase를 사용하는 법을 배워보자.
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include <iostream>
#include <ctime>
template<unsigned int limit>
class TimeTest : public testing::Test
{
protected:
virtual void SetUp()
{
start_time_ = time(NULL);
}
virtual void TearDown()
{
EXPECT_TRUE( time(NULL) - start_time_ <= limit );
}
private:
time_t start_time_;
};
class TestCalc : public TimeTest<1>
{
private:
typedef TimeTest<1> base;
protected:
void static SetUpTestCase()
{
std::cout << "TestCalc TestCase SetUp" << std::endl;
}
void static TearDownTestCase()
{
std::cout << "TestCalc TestCase TearDown" << std::endl;
}
protected:
virtual void SetUp()
{
base::SetUp();
std::cout << "SetUp" << std::endl;
}
virtual void TearDown()
{
base::TearDown();
std::cout << "TearDown" << std::endl;
}
protected:
int add(int lhs, int rhs)
{
return lhs + rhs;
}
int sub(int lhs, int rhs)
{
return lhs - rhs;
}
};
TEST_F(TestCalc, Test1)
{
ASSERT_EQ(add(1, 1), 1);
EXPECT_EQ(add(1, 1), 2);
}
TEST_F(TestCalc, Test2)
{
EXPECT_EQ(add(1, 1), 1);
EXPECT_EQ(sub(2, 1), 1);
}
TEST_F(TestCalc, Test3)
{
ASSERT_EQ(add(1, 1), 2);
EXPECT_EQ(sub(2, 1), 1);
}
int _tmain(int argc, _TCHAR* argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

TestCase 는 testing::Test 상속 받아서 만들어야 한다.
SetUp, TearDown은 TestMethod 마다 실행될 코드를 넣는다.
SetUpTestCase, TearDownTestCase는 TestCase 초기화, 마무리 코드를 넣는다.
TestCase 매크로는 TEST_F() 를 사용하여 만들면 된다. (TEST FIXTURE)
또 이곳에는 없지만 프로그램 전체 초기화, 마무리 코드도 넣어줄수 있다.
testing::Environment 를 상속받아 SetUp, TearDown 재정의 해주고,
testing::AddGoogleTestEnvironment() 함수를 사용하여 셋팅해 주면 된다.
출력창에 보이는 것과 같이 어떤 TestCase가 실행이 되었고, Method 별로 성공|실패를 알려주며, 실패시는 소스 코드 파일과 행을 출력하며 예상값과 실제값이 어떻게 틀린것인지 출력해준다.
google test 실행 인자
--gtest_output=xml:path - path 경로로 test 결과를 xml로 출력해 준다.
--gtest_break_on_failure (난 안되더라;; ㅡㅡ;) - 실패시 디버그 가능하도록 브레이크가 걸린단다.. -_-;
--gtest_filter=ExampleSuite.* - <- ExampleSuite 안에 있는 TestCase만 테스트 한다.
--gtest_filter=*Suite* <- Suite라는 이름이 들어간 TestSuite 모두를 테스트 한다.
–gtest_repeat=3 - 입력 횟수만큼 테스트 한다.
더 많은 옵션은 구글 코드에 가서 google test wiki를 참고 하기 바란다.
자세한 정보는 이곳(http://code.google.com/p/googletest/wiki/GoogleTestPrimer)을 참조 하기 바란다.
문서뿐 아니라 자세한 예제(http://code.google.com/p/googletest/wiki/GoogleTestSamples)도 많다.
이 글은 스프링노트에서 작성되었습니다.
댓글 없음:
댓글 쓰기