관심있는 것들 정리

MacOS에서 googletest 수행해보기 본문

카테고리 없음

MacOS에서 googletest 수행해보기

내공강화 2024. 8. 23. 22:43

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.

 

반응형