Skip to content

Commit 15e7134

Browse files
committed
add: GoogleTest環境の構築
1 parent 5e9436c commit 15e7134

File tree

7 files changed

+234
-0
lines changed

7 files changed

+234
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# ディレクトリ
2+
build

CMakeLists.txt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# GoogleTest用のCMakeLists.txt
2+
cmake_minimum_required(VERSION 3.14)
3+
project(etrobocon2025)
4+
5+
# C++標準とカバレッジ用フラグ
6+
set(CMAKE_CXX_STANDARD 17)
7+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
8+
set(CMAKE_CXX_EXTENSIONS OFF)
9+
10+
# デバッグビルド用のフラグ
11+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
12+
13+
# カバレッジレポート作成のオプション
14+
option(ENABLE_COVERAGE "Enable test coverage reporting" ON)
15+
if(ENABLE_COVERAGE)
16+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
17+
endif()
18+
19+
# GoogleTest のフェッチとビルド
20+
# Windows環境では動かないかも
21+
include(FetchContent)
22+
FetchContent_Declare(
23+
googletest
24+
URL https://github.com/google/googletest/archive/refs/tags/v1.16.0.zip
25+
)
26+
FetchContent_MakeAvailable(googletest)
27+
28+
# プロジェクトのソースディレクトリ構造の定義 (適宜登録)
29+
set(PROJECT_MODULE_DIR ${PROJECT_SOURCE_DIR}/modules)
30+
set(PROJECT_TEST_DIR ${PROJECT_SOURCE_DIR}/tests)
31+
32+
# 必要なインクルードディレクトリの設定 (適宜登録)
33+
set(INCLUDE_DIRS
34+
${PROJECT_MODULE_DIR}
35+
${PROJECT_TEST_DIR}/helpers
36+
)
37+
38+
# ソースファイルの登録 (適宜登録)
39+
file(GLOB_RECURSE PROJECT_SOURCES
40+
"${PROJECT_MODULE_DIR}/*.cpp"
41+
"${PROJECT_TEST_DIR}/helpers/*.cpp"
42+
)
43+
44+
# プロジェクトのライブラリターゲットを作成
45+
add_library(${PROJECT_NAME}_impl STATIC ${PROJECT_SOURCES})
46+
target_include_directories(${PROJECT_NAME}_impl PUBLIC ${INCLUDE_DIRS})
47+
48+
# テスト設定
49+
enable_testing()
50+
51+
# tests ディレクトリ内の *Test.cpp をすべてテストソースとして登録
52+
file(GLOB TEST_SOURCES "${PROJECT_TEST_DIR}/*Test.cpp")
53+
54+
# テスト実行可能ファイルの作成
55+
add_executable(${PROJECT_NAME}_test ${TEST_SOURCES})
56+
target_link_libraries(${PROJECT_NAME}_test
57+
PRIVATE
58+
${PROJECT_NAME}_impl
59+
gtest_main
60+
)
61+
62+
# テストの登録
63+
include(GoogleTest)
64+
gtest_discover_tests(${PROJECT_NAME}_test)

Makefile

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@ help:
1212
@echo " $$ make format"
1313
@echo フォーマットチェックをする
1414
@echo " $$ make format-check"
15+
@echo テストをビルドする
16+
@echo " $$ make test-build"
17+
@echo テストを実行する
18+
@echo " $$ make test-exec"
19+
@echo テスト用の'build'ディレクトリを削除する
20+
@echo " $$ make clean"
21+
@echo 環境が変わっている場合のみ build ディレクトリを削除する
22+
@echo " $$ make smart-clean"
23+
@echo 必要があればbuildディレクトリを削除し, テストをビルドして実行する
24+
@echo " $$ make test"
1525

1626
## 実行関連 ##
1727
build:
@@ -21,6 +31,53 @@ build:
2131
start:
2232
cd $(MAKEFILE_PATH)../ && make start
2333

34+
## テスト関連 ##
35+
# テストのビルドディレクトリが存在しない場合は作成する
36+
test-build:
37+
@mkdir -p $(MAKEFILE_PATH)build
38+
cd $(MAKEFILE_PATH)build && cmake .. && make
39+
40+
# テストを実行する
41+
test-exec:
42+
@if [ ! -f $(MAKEFILE_PATH)build/etrobocon2025_test ]; then \
43+
echo "テスト実行ファイルが見つかりません。まずビルドを実行してください。"; \
44+
echo " $$ make test-build"; \
45+
exit 1; \
46+
fi
47+
cd $(MAKEFILE_PATH)build && ./etrobocon2025_test
48+
49+
# テストをビルドして実行する
50+
test: smart-clean test-build test-exec
51+
52+
# build ディレクトリを完全に削除する
53+
clean:
54+
@if [ -d $(MAKEFILE_PATH)build ]; then \
55+
rm -rf $(MAKEFILE_PATH)build; \
56+
echo "'build/' ディレクトリを削除しました。"; \
57+
else \
58+
echo "'build/' ディレクトリは既に存在しません。"; \
59+
fi
60+
61+
# 実行環境が変更されている場合にのみ 'build' を削除する
62+
smart-clean:
63+
@if [ -d $(MAKEFILE_PATH)build ]; then \
64+
if [ -f "$(MAKEFILE_PATH)build/Makefile" ]; then \
65+
CMAKE_SOURCE_DIR=`grep -E "^CMAKE_SOURCE_DIR[[:space:]]*=" $(MAKEFILE_PATH)build/Makefile | cut -d= -f2 | xargs`; \
66+
CMAKE_SOURCE_DIR_REAL=`readlink -f "$$CMAKE_SOURCE_DIR"`; \
67+
CURRENT_DIR_REAL=`readlink -f "$$(pwd)"`; \
68+
echo "[DEBUG] CMAKE_SOURCE_DIR: '$$CMAKE_SOURCE_DIR_REAL'"; \
69+
echo "[DEBUG] CURRENT_DIR : '$$CURRENT_DIR_REAL'"; \
70+
if [ "$$CMAKE_SOURCE_DIR_REAL" != "$$CURRENT_DIR_REAL" ]; then \
71+
echo "[LOG] 実行環境の変更が検出されたため 'build/' を削除します。"; \
72+
rm -rf $(MAKEFILE_PATH)build; \
73+
else \
74+
echo "[LOG] 実行環境は変更されていません。"; \
75+
fi; \
76+
fi; \
77+
else \
78+
echo "'build/' ディレクトリは既に存在しません。"; \
79+
fi
80+
2481
## 開発関連 ##
2582
# ファイルにclang-formatを適用する
2683
format:

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@
22

33
宮崎大学片山徹郎研究室チーム KatLab が作成する[ET ロボコン 2025](https://www.etrobo.jp/)アドバンストクラスの走行システムプログラムです。
44

5+
## 構成
6+
### ./modules
7+
ソースファイルを格納
8+
### ./tests
9+
テストソースを格納
10+
511
## プロジェクトのビルド
612
### 実機の場合
713
```etrobocon2025```で以下を実行
814
```shell
915
make build
1016
```
1117
### 実機以外の場合
18+
etrobo環境でビルドが出来ないため,現状 (20250502) ではこの方法を考えています
1219
```etrobocon2025```で以下を順に実行
1320
1. (まだの場合は)bookworm環境のイメージを以下のコマンドで作成
1421
```shell
@@ -21,4 +28,16 @@ docker run -it --rm -v $(pwd):/RasPike-ART/sdk/workspace/etrobocon2025 myimage:a
2128
3. プロジェクトのビルド
2229
```shell
2330
make build
31+
```
32+
33+
## テスト
34+
```etrobocon2025```で以下を実行
35+
```shell
36+
make test
37+
```
38+
もしくは,```etrobocon2025```で以下を実行
39+
```shell
40+
make smart-clean
41+
make test-build
42+
make test-exec
2443
```

tests/EtRobocon2025Test.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @file EtRobocon2025Test.cpp
3+
* @brief EtRobocon2025クラスのテスト
4+
* @author takuchi17
5+
*/
6+
7+
#include <gtest/gtest.h>
8+
#include "EtRobocon2025.h"
9+
#include "helpers/OStreamCapture.h"
10+
11+
using namespace std;
12+
13+
namespace etrobocon2025_test {
14+
// start関数が最終的に標準出力に"Hello KATLAB"を出力することを確認するテスト
15+
TEST(EtRobocon2025Test, Start)
16+
{
17+
string expected = "Hello KATLAB\n";
18+
19+
// 標準出力をキャプチャ
20+
OStreamCapture capture(cout);
21+
22+
// start関数を実行
23+
EtRobocon2025::start();
24+
25+
EXPECT_EQ(expected, capture.getOutput());
26+
}
27+
} // namespace etrobocon2025_test

tests/helpers/OStreamCapture.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @file OStreamCapture.cpp
3+
* @brief C++ストリームをキャプチャするためのヘルパークラスの実装
4+
* @author takuchi17
5+
*/
6+
7+
#include "OStreamCapture.h"
8+
9+
OStreamCapture::OStreamCapture(ostream& _targetStream)
10+
: targetStream(_targetStream), originalBuf(_targetStream.rdbuf())
11+
{
12+
targetStream.rdbuf(buffer.rdbuf());
13+
}
14+
15+
OStreamCapture::~OStreamCapture()
16+
{
17+
targetStream.rdbuf(originalBuf);
18+
}
19+
20+
string OStreamCapture::getOutput() const
21+
{
22+
return buffer.str();
23+
}

tests/helpers/OStreamCapture.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* @file OStreamCapture.h
3+
* @brief C++ストリームをキャプチャするためのヘルパークラスの宣言
4+
* @author takuchi17
5+
*/
6+
7+
#ifndef O_STREAM_CAPTURE_H
8+
#define O_STREAM_CAPTURE_H
9+
10+
#include <iostream>
11+
#include <sstream>
12+
#include <streambuf>
13+
#include <string>
14+
15+
using namespace std;
16+
17+
class OStreamCapture {
18+
private:
19+
ostream& targetStream; // キャプチャ対象の出力ストリーム (例: std::cout)
20+
stringstream buffer; // 出力を一時的に保存するバッファ
21+
streambuf* originalBuf; // 元のストリームバッファ
22+
23+
public:
24+
/**
25+
* @brief コンストラクタ: ストリームキャプチャの開始 (バッファの差し替え)
26+
* @param _targetStream キャプチャしたい std::ostream (例: std::cout)
27+
*/
28+
OStreamCapture(ostream& _targetStream);
29+
30+
/**
31+
* @brief デストラクタ: キャプチャ終了とストリームバッファの復元
32+
*/
33+
~OStreamCapture();
34+
35+
/**
36+
* @brief キャプチャされた出力内容を取得
37+
* @return 出力された文字列
38+
*/
39+
string getOutput() const;
40+
};
41+
42+
#endif // O_STREAM_CAPTURE_H

0 commit comments

Comments
 (0)