๐C/C++๋ฅผ ํ ์คํธํ๋ ํ๋ ์์ํฌ์ธ Google test๋ฅผ M1๋งฅ๋ถ์์ ์ธํ ํ๋ ๊ณผ์ ์ ๋ํด ๋ค๋ฃจ๋ ๊ธ์ ๋๋ค.
๋ณดํต WSL์ ๊น์์ ๋ง์ด ์ฌ์ฉํ๋๋ฐ M1, M2๋งฅ๋ถ์์๋ ์ ๋์ง ์๋๋ค๊ณ ํด์ docker๋ฅผ ์ด์ฉํด ํ๊ฒฝ์ ์ธํ ํ๋ค. ๋ช ๋ น์ด๋ค์ iTerm์ ์ ๋ ฅํ๋ฉฐ ์งํํ๋ค.
๋จผ์ ์๋ ์ด๋ฏธ์ง๋ฅผ pull ๋ฐ๊ณ ์ดํ ์ปจํ ์ด๋๋ฅผ ์์ฑํ์ฌ ์คํํ๋ค.
https://hub.docker.com/r/srzzumix/googletest/
docker pull srzzumix/googletest
docker run -it -v /$(pwd):/code srzzumix/googletest sh
์ฌ๊ธฐ๊น์ง ์คํํ๋ค๋ฉด ์๋์ ๊ฐ์ด #์ผ๋ก ์์ํ๋ ์ปค๋งจ๋๋ผ์ธ์ผ๋ก ์ง์ ํ๊ฒ ๋๋ค.
dockerDesktop ์ฑ์์๋ ์ปจํ ์ด๋๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋๊ฐ๋ ค๋ฉด exit ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ค๋ง docker run -it -v /$(pwd):/code srzzumix/googletest sh
๋ช
๋ น์ด๋ ์ด๋ฏธ์ง๋ฅผ ํตํด ์ปจํ
์ด๋๋ฅผ ๋ง๋๋ ๋ช
๋ น์ด์ด๊ธฐ ๋๋ฌธ์ ๋ค์ ํด๋น ์ปจํ
์ด๋์ ์ปค๋งจ๋๋ผ์ธ์ผ๋ก ์ ๊ทผํ๋ ค๋ฉด ์ปจํ
์ด๋๋ฅผ ์คํํ๋ ๋ช
๋ น์ด์ธ ์๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์ ๋ช
๋ น์ด๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ฉด ๊ณ์ํ์ฌ ์ปจํ
์ด๋๊ฐ ์๋ก ์์ฑ๋๋ค.
docker exec -it [์ปจํ
์ด๋ Id] /bin/sh
์ด์ ์ค์นํ googleTest๋ฅผ ์ฌ์ฉํด๋ณด๋๋ก ํ์. ์ ๋ช ๋ น์ด๋ก ๋ค์ ์ปจํ ์ด๋ ์ปค๋งจ๋๋ผ์ธ์ ์ ๊ทผํ ๋ค ํด๋๋ฅผ ๋ง๋ค๋๋ก ํ์.
mkdir my_project && cd my_project
๊ทธ๋ฆฌ๊ณ my_project ํด๋์ ์๋์ ๊ฐ์ด ํ์ผ์ ๋๊ฐ ๋ง๋ค์ด์ผ ํ๋ค. ํ์ผ๋ช ๋ ๋ง์ถฐ์ผ ์ ์์ ์ผ๋ก vi๋ก ํ์ผ์ ์์ฑํ๋ คํ์ผ๋ ์ ๋์ง ์์์ ๋๋ vscode๋ก ์งํํ๋ค.
CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(my_project)
# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
enable_testing()
add_executable(
hello_test
hello_test.cc
)
target_link_libraries(
hello_test
GTest::gtest_main
)
include(GoogleTest)
gtest_discover_tests(hello_test)
hello_test.cc
#include <gtest/gtest.h>
// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
// Expect two strings not to be equal.
EXPECT_STRNE("hello", "world");
// Expect equality.
EXPECT_EQ(7 * 6, 42);
}
์ด์ ๋ค์ ํฐ๋ฏธ๋๋ก ๋์์์ ์๋ ๋ช ๋ น์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ๋ ฅํ๋ฉด ๋๋ค.
mkdir build && cd build
cmake .. //CMakeLists.txt์ ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก Makefile ํ์ผ ์์ฑ
make //Makefile์คํ
./hello_test //hello_testํ์ผ ์คํ
์ฌ๊ธฐ๊น์ง ํ์ผ๋ฉด build ํ์ผ ์์ hello_test ์คํ ํ์ผ์ด ์์ฑ๋์์ํ ๋ฐ ์ด๊ฒ์ ์คํํ๋ฉด ๋๋ค. googleTestํ๊ฒฝ์ด ๋์ปค์ ๊ตฌ์ถ๋์ด ์๊ธฐ์ iterm์์ docker exec ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด bash๋ฅผ ์ฐ ๋ค ์คํํด๋ ๋๊ณ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก๋ vscode์์ docker extension์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
docker extension์ ๊น๋ฉด ์ผ์ชฝ์ ๋์ปค ๋ก๊ทธ๊ฐ ์๊ธฐ๋๋ฐ ์ปจํ ์ด๋ ์ค ๊ตฌ๊ธ ํ ์คํธ๊ฐ ๊น๋ฆฐ ์ปจํ ์ด๋๋ฅผ ์ฐํด๋ฆญํ๋ฉด attach shell๋ฉ๋ด๊ฐ ๋์จ๋ค.
ํด๋น ์์์ ์์์ ๋ง๋ buildํด๋๋ก ์ด๋ํ ๋ค hello_testํ์ผ์ ์คํํ๋ฉด ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
cd my_project/build //์์์ ๋ง๋ ํด๋๋ก ์ด๋
./hello_test. //hello_testํ์ผ ์คํ
์ด์ testํ์ผ์ด ๋ฐ๋์๋ค๋ฉด build ํด๋์์ make๋ช ๋ น์ด๋ฅผ ์คํํด ์ค ๋ค ๋ค์ hello_testํ์ผ์ ์คํํ๋ฉด ๋๋ค. ํ ์คํธ๋ฅผ ์ํด hello_test.cc์ ๋ด์ฉ์ ์๋์ ๊ฐ์ด ์์ ํ๋ค.
#include <gtest/gtest.h>
// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
// Expect two strings not to be equal.
EXPECT_STRNE("hello", "world");
// Expect equality.
EXPECT_EQ(7 * 6, 42);
// [์ถ๊ฐ๋ ๋ด์ฉ] ์คํจํ ํ
์คํธ
EXPECT_EQ(7 * 6, 50);
}
์ดํ docker์ bash์์ ์๋ ๋ช ๋ น์ด๋ค์ ์คํํด์ฃผ์๋ค.
//buildํด๋์์
make //makeํ์ผ์ ๋ช
์๋ ๋ด์ฉ์ ๋ฐ๋ผ ์ฌ์ปดํ์ผ
./hello_test //์๋ก ๋ง๋ค์ด์ง hello_testํ์ผ ์์ฑ
์ฌ๊ธฐ๊น์ง ์ฑ๊ณตํ๋ค๋ฉด googleTestํ๊ฒฝ ๊ตฌ์ถ์ด ์๋ฃ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์์์ ์ฌ์ฉํ cmake์ make์ ๋ํด ์ค๋ช ํ๊ณ ๊ธ์ ๋ง์น๋๋ก ํ๊ฒ ๋ค.
cmake๋ช ๋ น์ Makefile์ ์์ฑํ๋ ๋ช ๋ น์ด์ด๊ณ makeํ์ผ์ Makefile์ ์ ์๋ ๋ด์ฉ์ ์คํํ๋ ๋ช ๋ น์ด์ด๋ค.
Makefile์ ๋ํด ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด ํ์ผ๊ฐ์ ์์กด์ฑ์ ์ ์ํด ๋์ ํ์ผ์ด๋ค. ์๋ฅผ๋ค์ด ํ์ผ ๊ตฌ์กฐ๊ฐ ์๋์ ๊ฐ๋ค๊ณ ์๊ฐํด๋ณด์.
์ด ์ํฉ์์ world.c๊ฐ ์์ ๋์๋ค๊ณ ํ๋ฉด ์ฐ๋ฆฌ๋ world.c์ world.h๋ฅผ ์ปดํ์ผํ์ฌ world.o๋ฅผ ๋ง๋ค๊ณ ๋ค์ hello1.o์ world.o๋ฅผ ์ปดํ์ผํ์ฌ hello_world์คํํ์ผ์ ๋ง๋ค์ด์ผ ํ ๊ฒ์ด๋ค. ๋ง์ผ ํ์ผ ๊ตฌ์กฐ๊ฐ ๋ ๋ณต์กํ๋ค๋ฉด? ๋ ์ฌ๋ฌ๋ฒ ์ปดํ์ผ ๋ช ๋ น์ด๋ฅผ ์ณ์ผ ํ ๊ฒ์ด๋ค.
์ด๋ฅผ ๊ฐํธํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด Makefile์ด๋ค. Makefile์๋ ๊ฐ ํ์ผ์ด ์ด๋ค ํ์ผ์ ์์กดํ๊ณ ์๋์ง ์ ๋ณด๊ฐ ๊ธฐ๋ก๋์ด์์ด์ make๋ช ๋ น์ด ํ ์ค์ด๋ฉด ์์์ ํด์ผ ํ ์์ ์ ๋ชจ๋ ํด์ค๋ค. ๋ง์ผ ์์ ๊ฐ์ ์ํฉ์ด๋ผ๋ฉด make๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ ๋ world.c์ world.h๋ฅผ ์ปดํ์ผํ์ฌ world.o๋ฅผ ๋ง๋ค๊ณ ๋ค์ hello1.o์ world.o๋ฅผ ์ปดํ์ผํ์ฌ ์๋ก์ด hello_world ์คํํ์ผ์ ๋ง๋ค์ด ์ค ๊ฒ์ด๋ค.
๋๊ธ