|
|
|
|
# OOP Exercise - Google Test
|
|
|
|
|
|
|
|
|
|
## 使用方法
|
|
|
|
|
|
|
|
|
|
clone 專案並進入專案目錄
|
|
|
|
|
```sh
|
|
|
|
|
git clone https://gitea.cglab.cs.nccu.edu.tw/yhchen/gtest_exercise.git
|
|
|
|
|
cd gtest_exercise
|
|
|
|
|
```
|
|
|
|
|
建立 build 目錄,所有編譯需要的檔案會被建立在這個目錄裡面
|
|
|
|
|
```sh
|
|
|
|
|
mkdir build
|
|
|
|
|
cd build
|
|
|
|
|
```
|
|
|
|
|
使用 cmake 建立 makefile,並編譯檔案
|
|
|
|
|
```sh
|
|
|
|
|
cmake ..
|
|
|
|
|
make
|
|
|
|
|
```
|
|
|
|
|
進入 `unittest` 目錄,如果有看到 `utest` 執行檔,代表編譯順利完成
|
|
|
|
|
```sh
|
|
|
|
|
cd unittest
|
|
|
|
|
./utest
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 練習內容
|
|
|
|
|
在 `src` 目錄中含有 `sphere` 物件的宣告及實作,但是這個程式碼中有一些邏輯錯誤,同學需完成以下步驟:
|
|
|
|
|
1. 編寫 unittest 使 sphere 程式碼覆蓋率達到 80% 以上
|
|
|
|
|
2. 修改 `sphere.cc` 程式碼,使程式的邏輯完全正確
|
|
|
|
|
|
|
|
|
|
## 覆蓋率計算
|
|
|
|
|
這個專案的 cmake 檔案包含計算覆蓋率的工具,會在編譯 `unittest` 及 `src` 目錄時同時產生覆蓋率統計的檔案在 `build/資料夾位置/CMakeFiles/專案名稱.dir/檔案名稱.cc.gcno`,在執行過程式之後,可以執行下列指令顯示覆蓋率
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
gcov <gcno檔位置>
|
|
|
|
|
```
|
|
|
|
|
以 `sphere.cc` 為例,要查看覆蓋率可以執行
|
|
|
|
|
```sh
|
|
|
|
|
cd build/src/CMakeFiles/sphere.dir
|
|
|
|
|
gcov sphere.cc.gcno
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
在 macos 中,預設使用的內建 gcov 會無法開啟生成的檔案,需要使用 homebrew 安裝的 gcov(安裝 gcc 時會自動安裝),通常為 `gcov-12`,執行下列指令能夠檢查是否使用內建的 gcov
|
|
|
|
|
```sh
|
|
|
|
|
which gcov
|
|
|
|
|
```
|
|
|
|
|
如果輸出為 `/usr/bin/gcov`,就代表使用的是內建的 gcov。
|
|
|
|
|
|
|
|
|
|
## 附錄
|
|
|
|
|
|
|
|
|
|
### GTest 指令
|
|
|
|
|
|
|
|
|
|
| `ASSERT` 類 | `EXPECT` 類 | 說明
|
|
|
|
|
-|-|-
|
|
|
|
|
`ASSERT_TRUE(condition)` | `EXPECT_TRUE(condition)` | 檢查是否為真
|
|
|
|
|
`ASSERT_FALSE(condition)` | `EXPECT_FALSE(condition)` | 檢查是否為假
|
|
|
|
|
`ASSERT_EQ(expected,actual)` | `EXPECT_EQ(expected,actual)` | 檢查數值是否相等
|
|
|
|
|
`ASSERT_NE(val1,val2)` | `EXPECT_NE(val1,val2)` | 檢查數值是否不相等
|
|
|
|
|
`ASSERT_LT(val1,val2)` | `EXPECT_LT(val1,val2)` | val1 < val2
|
|
|
|
|
`ASSERT_LE(val1,val2)` | `EXPECT_LE(val1,val2)` | val1 <= val2
|
|
|
|
|
`ASSERT_GT(val1,val2)` | `EXPECT_GT(val1,val2)` | val1 > val2
|
|
|
|
|
`ASSERT_GE(val1,val2)` | `EXPECT_GE(val1,val2)` | val1 >= val2
|
|
|
|
|
`ASSERT_STREQ(str1,str2)` | `EXPECT_STREQ(str1,str2)` | 檢查字串是否相等
|
|
|
|
|
`ASSERT_STRNE(str1,str2)` | `EXPECT_STRNE(str1,str2)` | 檢查字串是否不相等
|
|
|
|
|
`ASSERT_STRCASEEQ(str1,str2)` |`EXPECT_STRCASEEQ(str1,str2)` | 檢查字串是否相等(不分大小寫)
|
|
|
|
|
`ASSERT_STRCASENE(str1,str2)` | `EXPECT_STRCASENE(str1,str2)` | 檢查字串是否不相等(不分大小寫)
|
|
|
|
|
|
|
|
|
|
### Linux 環境下安裝 cmake (以 ubuntu 為例)
|
|
|
|
|
|
|
|
|
|
若環境有需要,請自行加上 `sudo`
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
apt update
|
|
|
|
|
apt install g++ cmake
|
|
|
|
|
```
|
|
|
|
|
### Windows 環境下安裝 cmake
|
|
|
|
|
|
|
|
|
|
可以安裝 Windows Subsystem of Linux,並按照上述 Linux 的步驟操作
|
|
|
|
|
|
|
|
|
|
### MacOS 環境下安裝 cmake
|
|
|
|
|
|
|
|
|
|
需先安裝 brew,安裝完成後執行
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
brew install gcc cmake
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
若使用的是 M1 mac,需要手動將 g++ 加入 PATH,請自行 google
|