<< slack 대화창에서 여러가지 표현 방법 | Home | Trello, Github, Slack을 활용한 개발 프로세스 >>

C++에서 단위 테스트용으로 Google Test 사용기

Google Test 설치 및 샘플 테스트

1. 다운로드
- gtest-1.7.0.zip(https://code.google.com/p/googletest/downloads/list)
- /App 디렉토리 밑에 압축을 푼다.

2. 샘플 테스트코드 테스트
> cd make
> make
> ./sample1_unittest
Running main() from gtest_main.cc
[==========] Running 6 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 3 tests from FactorialTest
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (0 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[----------] 3 tests from FactorialTest (0 ms total)

[----------] 3 tests from IsPrimeTest
[ RUN      ] IsPrimeTest.Negative
[       OK ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[----------] 3 tests from IsPrimeTest (0 ms total)

[----------] Global test environment tear-down
[==========] 6 tests from 2 test cases ran. (0 ms total)
[  PASSED  ] 6 tests.

Google Test 구조




a.cpp에 필요한 기능들을 구현하고 a.cpp의 단위 테스트는 a_unittest.cpp에 테스트 코드를 작성해 a.cpp, a_unittest.cpp, gtest_main.cc, gtest-all.cc를 컴파일 하고 링크하면 단위 테스트용 샐행파일이 생성된다. 이 실행파일을 실행하면 단위 테스트의 전수 테스트를 실행하게 된다.

테스트 함수 설명

EXPECT_*는 실패 후에도 테스트를 계속 진행하고 싶을 경우 쓰고, ASSERT_*는 테스트를 멈추고 싶을 경우 쓰면 된다. 아래는 EXPECT_*만 기술했는데, 동일하게 ASSERT_*도 있다.

1. 기본 함수
EXPECT_TRUE(condition) : condition이 true인지.
EXPECT_FALSE(condition) : condition이 false인지.

2. 두 값의 비교
EXPECT_EQ(expected, actual) : expected == actual.
EXPECT_NE(val1, val2) : val1 != val2.
EXPECT_LT(val1, val2) : val1 < val2.
EXPECT_LE(val1, val2) : val1 <= val2.
EXPECT_GT(val1, val2) : val1 > val2.
EXPECT_GE(val1, val2) : val1 >= val2.

3. 문자열 비교
EXPECT_STREQ(expected_str, actual_str) : 2개의 문자열 내용이 동일한지 확인.
EXPECT_STRNE(str1, str2) : 2개의 문자열 내용이 같지 않음을 확인.
EXPECT_STRCASEEQ(expected_str, actual_str) : 대소 문자를 무시했을 경우, 
2개의 문자열 내용이 동일한지 확인. EXPECT_STRCASENE(str1, str2) : 대소 문자를 무시했을 경우, 2개의 문자열 내용이 같지 않음을 확인.

사용자 코드 테스트

1. 테스트 함수를 만든다.
test 디렉토리 아래 클래스의 테스트 함수를 만든다. 보통 "TEST(테스트케이스이름, 테스트이름) {..}"방식으로 테스트 케이스를 만드는데, 같은 데이터로 2개 이상의 테스트를 만든다면 테스트 픽스쳐를 사용할 수 있다.
TEST_F(테스트케이스이름, 테스트이름) {
 ... 테스트 ...
}
그리고 SetUp에는 테스트 함수 시작전에 실행해야할 것들 정의하고, TearDown함수에는 테스트 함수 종료후 실행할 것들 정의하면 됩니다.

2. Makefile을 만든다.
테스트와 관련된 부분만 발췌를 합니다.
GTEST_DIR = /Apps/gtest-1.7.0
CPPFLAGS += -isystem $(GTEST_DIR)/include
TESTS = unittest

GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
                $(GTEST_DIR)/include/gtest/internal/*.h
GTEST_SRCS = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)

gtest-all.o : $(GTEST_SRCS_)
        $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest-all.cc

gtest_main.o : $(GTEST_SRCS_)
        $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest_main.cc

gtest.a : gtest-all.o
        $(AR) $(ARFLAGS) $@ $^

gtest_main.a : gtest-all.o gtest_main.o
        $(AR) $(ARFLAGS) $@ $^

test : $(TESTS)

unittest : a.o test/a_unittest.o \
         gtest_main.a
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $(LDFLAGS) $^ -o $@

3. 단위 테스트를 돌린다.
> make test

make test를 하면 unittest라는 실행파일이 생성되고 그 실행파일을 실행하면 테스트 전체를 수행하게 된다.
> ./unittest

Tags : , , ,



Add a comment Send a TrackBack