C++ Testing

介紹

C++ 官方並沒有定義撰寫測試一整套工具, 所以有很多第三方的實做, 其中的 Google Test 使用於 LLVM、OpenCV、Chromium 等專案。

其他語言的狀況:

  • Python 內建了 unittest module,但是仍有更為方便的第三方套件實做,例如 pytsetnose

  • Rust 官方有實做撰寫測試程式的方式,也有第三方套件在上面做擴充

Google Test

Google Test 是一套 Google 開發的測試 Framework, 除了 Google 自身使用外, 也設計了擴充機制, 期望能整合 C++ 測試 Framework 過於多套、分散的狀況。

Google Test 不需要 Exception 和 RTTI 的支援, 但是開啟的話可以提供額外的功能。

要使用 Google Test 的話要把它編譯成一個 Library, 所有測試程式都要連結到這個 Libray, 而 Google Test 內建多種 Build System 的支援, 可以選擇其中一種使用, 例如 CMake。

專案範例: CMake + Google Test

Google Test 官方文件:

Google Mock 官方文件:

TEST(FactorialTest, HandlesPositiveInput) {
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
}

定義客製化 assertions

AssertionResult IsInRange(int value, int low, int high) {
  if (value < low)
    return AssertionFailure()
        << value << " < lower bound " << low;
  else if (value > high)
    return AssertionFailure()
        << value << " > upper bound " << high;
  else
    return AssertionSuccess()
        << value << " is in range ["
        << low << ", " << high << "]";
}

EXPECT_TRUE(IsInRange(SomeFunction(), low, high))

Value of: IsInRange(SomeFunction(), low, high)
  Actual: false (13 < lower bound 20)
Expected: true

EXPECT_FALSE(IsInRange(SomeFunction(), low, high))

Value of: IsInRange(AnotherFunction(), low, high)
 Actual: true (25 is in range [20, 60])
Expected: false