관심있는 것들 정리
MacOS에서 googletest 수행해보기 본문
googletest가 나온지 상당히 오래됐고, 회사에서 사용한지도 꽤 오래됐다.
그래서 집에 있는 Mac 머신에서도 googletest 수행해보려고 해 보면 자꾸 에러가 나서,
간단히 컴파일하는 방법과 관련 CMakeLists.txt 파일을 정리해 둔다.
1. googletest 개발용 header와 library 설치
$ git clone https://github.com/google/googletest.git
$ cd googletest
$ mkdir install
$ cd install
$ cmake ../
$ make
$ sudo make install
$ export CPLUS_INCLUDE_PATH=/usr/local/include
$ export LIBRARY_PATH=/usr/local/lib
이렇게 하면, 개발된 library가 /usr/local 디렉토리 아래에 설치된다. 추후 컴파일 등에 문제가 없도록 export 수행한 환경 변수 PATH 설정 내용은 bash shell이라면 .bashrc 또는 .bash_profile에, zsh 이라면 .zshrc에 내용을 추가해 주자.
2. simple program 작성, 컴파일 및 수행
아무 디렉토리나 하나 생성한 후 다음과 같은 테스트 코드를 생성하자.
(어디선가 복붙한 내용인데... 어디서 찾아온 것인지 기억이.. ㅠㅠ)
summer.cpp
#include<iostream>
double summer(double arr[], int size)
{
double sum = 0;
for(int i=0; i < size; ++i) sum += arr[i];
return sum;
}
summerMain.cpp
#include <iostream>
//include the google test dependencies
#include <gtest/gtest.h>
//declare the function(s) that you are testing
double summer(double[], int);
//our first unit test
TEST(IntegerInputsSuite, simpleSum)
{
//first, set up any inputs to your
const int SIZE = 3;
double arr[SIZE] = {1, 2, 3};
//then, make an assertion to test
EXPECT_EQ(summer(arr, SIZE), 6) << "The sum is not correct";
}
TEST(IntegerInputsSuite, oneElement)
{
const int SIZE = 1;
double arr[SIZE] = {33};
EXPECT_EQ(summer(arr, SIZE), 33) << "The sum is not correct for array of size 1";
}
TEST(DoubleInputsSuite, simpleSum)
{
const int SIZE = 3;
double arr[SIZE] = {1.1, 1.1, 1};
EXPECT_EQ(summer(arr, SIZE), 3.2) << "The sum is not correct using double inputs";
}
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
이 코드들을 컴파일할 CMakeLists.txt 파일은 다음과 같다.
CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(sumProgram)
# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
enable_testing()
add_executable(
${PROJECT_NAME}
summer.cpp
summerMain.cpp
)
target_link_libraries(
${PROJECT_NAME}
gtest
gtest_main
)
디렉토리 구조는 다음과 같다
❯ tree
.
├── CMakeLists.txt
├── Makefile
├── summer.cpp
└── summerMain.cpp
install 디렉토리를 만들고 이동하여 cmake와 make를 다음과 같이 수행한다.
$ mkdir install;cd install;cmake ../;make
-- The C compiler identification is AppleClang 15.0.0.15000309
-- The CXX compiler identification is AppleClang 15.0.0.15000309
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.4s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/slux78/Documents/gtest/install
[ 33%] Building CXX object CMakeFiles/sumProgram.dir/summer.cpp.o
[ 66%] Building CXX object CMakeFiles/sumProgram.dir/summerMain.cpp.o
[100%] Linking CXX executable sumProgram
[100%] Built target sumProgram
만약 Makefile을 이용한다면 다음과 같이 하면 된다.
CFLAGS=-std=c++14
LDFLAGS=-lgtest -lgtest_main -pthread
OBJS=summer.o summerMain.o
PROGNAME=sumProgram
all: $(PROGNAME)
$(PROGNAME): $(OBJS)
g++ -o $@ $(OBJS) $(LDFLAGS) -o $(PROGNAME)
summer.o: summer.cpp
g++ -c -o $@ $(CFLAGS) $<
summerMain.o: summerMain.cpp
g++ -c -o $@ $(CFLAGS) $<
clean:
@rm -rf $(OBJS) $(PROGNAME)
Makefile을 이용할 경우 make 라고만 입력하면 컴파일된다. (생성 파일 위치만 달라진다)
생성된 파일을 실행하면 다음과 같은 결과를 볼 수 있다.
$ ./sumProgram
[==========] Running 3 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 2 tests from IntegerInputsSuite
[ RUN ] IntegerInputsSuite.simpleSum
[ OK ] IntegerInputsSuite.simpleSum (0 ms)
[ RUN ] IntegerInputsSuite.oneElement
[ OK ] IntegerInputsSuite.oneElement (0 ms)
[----------] 2 tests from IntegerInputsSuite (0 ms total)
[----------] 1 test from DoubleInputsSuite
[ RUN ] DoubleInputsSuite.simpleSum
[ OK ] DoubleInputsSuite.simpleSum (0 ms)
[----------] 1 test from DoubleInputsSuite (0 ms total)
[----------] Global test environment tear-down
[==========] 3 tests from 2 test suites ran. (0 ms total)
[ PASSED ] 3 tests.
반응형