2009년 5월 20일 수요일

google test

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)도 많다.

 

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기