2008-07-04

Google Test

구글에서 나온 C++ Unit Test Framework.

대체적으로 다른 프레임워크와 유사한데 몇몇 특징적인 기능들이 눈에 띄어서 요약해본다.

Custom Failure Message : 테스트 실패시 에러 메시지를 보다 친절하게 쓸 수 있다. 아래 예제처럼 i 값을 출력할 수 있다는 점이 멋지다.


for (int i = 0; i < x.size(); ++i) {
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}

Predicate Assertions : 테스트 코드에서 함수를 호출했다가 실패하면, 파라미터로 뭘 넘겼는지를 출력해준다.


bool MutuallyPrime(int m, int n) { ... }
const int a = 3;
const int b = 4;
const int c = 10;
EXPECT_PRED2(MutuallyPrime, b, c);
.....
MutuallyPrime(b, c) is false,
where
b is 4
c is 10

Scoped Assert : 다른 함수에 테스트 코드가 들어있고, 이걸 여러 테스트에서 사용할 경우 도대체 어느 테스트에서 실패했는지를 알려주는 기능이다.


10: void Sub1(int n) {
11: EXPECT_EQ(1, Bar(n));
12: EXPECT_EQ(2, Bar(n + 1));
13: }
14:
15: TEST(FooTest, Bar) {
16: {
17: SCOPED_TRACE("A"); // This trace point will be included in
18: // every failure in this scope.
19: Sub1(1);
20: }
21: // Now it won't.
22: Sub1(9);
23: }
...
path/to/foo_test.cc:11: Failure
Value of: Bar(n)
Expected: 1
Actual: 2
Trace:
path/to/foo_test.cc:17: A
path/to/foo_test.cc:12: Failure
Value of: Bar(n + 1)
Expected: 2
Actual: 3

--gtest_break_on_failure : 테스트를 디버거로 실행할 경우, 주요 에러 발생시 바로 해당 라인에서 브레이크가 걸리게해주는 커맨드라인 명령. 이 기능이면 테스트 실행 -> 실패 발견 -> 해당 라인에 브레이크 걸기 -> 디버거 붙여서 재시작 이라는 귀찮은 작업에서 해방된다.

--gtest_filter : 특정 테스트만 실행하고 싶을 때, 기존 코드를 건드리지 않고 커맨드라인에서 필터링을 할 수 있다. 이거야말로 대박 기능인 듯!

--gtest_filter=FooTest. : FooTest 하위 테스트를 모두 실행
--gtest_filter=
Null:Constructor : 이름에 "Null" 또는 "Constructor"를 포함한 모든 테스트를 실행
--gtest_filter=-
DeathTest. : DeathTest 가 아닌 모든 테스트를 실행
--gtest_filter=FooTest.
-FooTest.Bar : FooTest 중에서 FooTest.Bar를 제외한 나머지 테스트를 실행
--gtest_repeat : 테스트를 N번 실행할 수 있다. --gtest_filter 와 함께 쓰면 특정 테스트만 반복해서 수행할 수 있다.

DISABLED_ : 임시로 테스트를 실행하지 않으려면 코멘트로 막는 대신 이름 앞에다가 DISABLED_ 를 붙이면 된다.

대충 기능만 훑어봤는데도 이 넘들이 진짜 테스트에서 귀찮은 게 무엇인지를 잘 알고 만들었다는 느낌이 든다. 멋진 놈들이란 말이야


comments powered by Disqus