在 C++ 项目中使用 Google Test & Benchmark


编译安装

Google Test/Benchmark 是基于 CMake 构建的。跨平台支持非常的好,Windows 可以使用 nmake 编译安装,默认会在 Program Files 目录下创建包含库和头文件的 benchmark 文件夹。

具体过程可以参考:https://learn.microsoft.com/en-us/visualstudio/test/how-to-use-google-test-for-cpp

轻量级的单元测试可以使用微软内置的测试框架:https://learn.microsoft.com/en-us/visualstudio/test/how-to-use-microsoft-test-framework-for-cpp

相关报错

error LNK2001: unresolved external symbol __CxxFrameHandler4 and __GSHandlerCheck_EH4

这个是因为编译 benchmark 库和项目的 msvc 工具链的版本不一样导致的,Visual Studio 这一侧的版本很好切换,CMake 那面使用参数 -G "Visual Studio 15 2017 Win64" 切换。

https://stackoverflow.com/questions/66151081/error-lnk2001-unresolved-external-symbol-cxxframehandler4-and-gshandlerchec

LINK : warning LNK4217: Symbol"?PrintDefaultHelp@benchmark@@YAXXZ ...

如果是 benchmark 自己的符号 importa 失败了,有可能是没有定义 BENCHMARK_STATIC_DEFINE.

https://github.com/google/benchmark/issues/1450

基本使用

https://www.cnblogs.com/coderzh/archive/2009/04/11/1433744.html

Google Benchmark 的前端主要用宏来实现,比较轻巧。

Test

#include "pch.h"

constexpr int a = 1, b = 2;

TEST(TestCaseOps, TestAdd) {
    EXPECT_EQ(bitAdd(a, b), a + b);
}

TEST(TestCaseOps, TestSub) {
    EXPECT_EQ(bitSub(a, b), a - b);
}

TEST(TestCaseOps, TestMul) {
    EXPECT_EQ(bitMul(a, b), a * b);
    EXPECT_EQ(bitMul(a, 0), a * 0);
    EXPECT_EQ(bitMul(0, b), 0 * b);
}

TEST(TestCaseOps, TestDiv) {
    EXPECT_EQ(bitDiv(a, b), a / b);
    EXPECT_EQ(bitDiv(0, 0), 0);
    EXPECT_EQ(bitDiv(1, 0), 0x7fffffff);
    EXPECT_EQ(bitDiv(-1, 0), -0x80000000i32);
    EXPECT_EQ(bitDiv(9, 3), 9 / 3);
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

Benchmark

#include <benchmark/benchmark.h>

static void BM_StringCreation(benchmark::State &state) {
    for (auto _ : state)
        std::string empty_string;
}
BENCHMARK(BM_StringCreation);

static void BM_StringCopy(benchmark::State &state) {
    std::string x = "hello";
    for (auto _ : state)
        std::string copy(x);
}
BENCHMARK(BM_StringCopy);

BENCHMARK_MAIN();
image-20230719104135019

文章作者: sfc9982
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 sfc9982 !
  目录