跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ GoogleTest
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++ GoogleTest = GoogleTest(简称gtest)是Google开发的C++单元测试框架,用于编写自动化测试用例。它支持多种测试模式(如单元测试、集成测试),提供丰富的断言宏和测试组织工具,是C++项目中广泛采用的测试解决方案。 == 核心概念 == === 测试用例结构 === GoogleTest中测试由以下层级构成: * '''测试套件(Test Suite)''':一组相关测试用例的集合 * '''测试用例(Test Case)''':独立的测试单元 * '''断言(Assertion)''':验证条件是否满足的检查点 <mermaid> graph TD A[Test Program] --> B[Test Suite 1] A --> C[Test Suite 2] B --> D[Test Case A] B --> E[Test Case B] C --> F[Test Case C] D --> G[Assertion 1] D --> H[Assertion 2] </mermaid> === 断言类型 === GoogleTest提供两类断言: * '''非致命断言''':<code>EXPECT_*</code>,测试继续执行即使失败 * '''致命断言''':<code>ASSERT_*</code>,失败时立即终止当前测试 常见断言示例: {| class="wikitable" |- ! 断言类型 !! 示例 !! 说明 |- | 相等检查 || <code>EXPECT_EQ(a, b)</code> || 验证a == b |- | 布尔检查 || <code>ASSERT_TRUE(cond)</code> || 验证条件为真 |- | 异常检查 || <code>EXPECT_THROW(stmt, exc_type)</code> || 验证语句抛出指定异常 |} == 安装与配置 == === Linux安装 === <syntaxhighlight lang="bash"> # 下载源码 git clone https://github.com/google/googletest.git cd googletest mkdir build && cd build cmake .. make sudo make install # 安装到系统目录 </syntaxhighlight> === CMake集成 === 现代C++项目通常通过CMake集成GoogleTest: <syntaxhighlight lang="cmake"> find_package(GTest REQUIRED) include_directories(${GTEST_INCLUDE_DIRS}) add_executable(MyTests test1.cpp test2.cpp) target_link_libraries(MyTests ${GTEST_LIBRARIES} pthread) </syntaxhighlight> == 基础用法示例 == === 简单测试用例 === <syntaxhighlight lang="cpp"> #include <gtest/gtest.h> // 被测函数 int Factorial(int n) { return n <= 1 ? 1 : n * Factorial(n - 1); } // 测试套件定义 TEST(FactorialTest, HandlesPositiveInput) { EXPECT_EQ(Factorial(1), 1); EXPECT_EQ(Factorial(2), 2); EXPECT_EQ(Factorial(3), 6); EXPECT_EQ(Factorial(10), 3628800); } TEST(FactorialTest, HandlesZeroInput) { ASSERT_EQ(Factorial(0), 1); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } </syntaxhighlight> 输出示例: <pre> [==========] Running 2 tests from 1 test suite. [----------] Global test environment set-up. [----------] 2 tests from FactorialTest [ RUN ] FactorialTest.HandlesPositiveInput [ OK ] FactorialTest.HandlesPositiveInput (0 ms) [ RUN ] FactorialTest.HandlesZeroInput [ OK ] FactorialTest.HandlesZeroInput (0 ms) [==========] 2 tests from 1 test suite ran. (2 ms total) [ PASSED ] 2 tests. </pre> == 高级特性 == === 测试夹具(Test Fixtures) === 用于共享测试配置和资源: <syntaxhighlight lang="cpp"> class StackTest : public ::testing::Test { protected: void SetUp() override { stack.push(1); stack.push(2); } void TearDown() override { // 清理代码 } std::stack<int> stack; }; TEST_F(StackTest, PushIncreasesSize) { stack.push(3); ASSERT_EQ(stack.size(), 3); } TEST_F(StackTest, PopReturnsLastValue) { int val = stack.top(); stack.pop(); EXPECT_EQ(val, 2); EXPECT_EQ(stack.size(), 1); } </syntaxhighlight> === 参数化测试 === 允许使用不同参数运行相同测试逻辑: <syntaxhighlight lang="cpp"> class IsPrimeTest : public ::testing::TestWithParam<int> {}; TEST_P(IsPrimeTest, HandlesVariousInputs) { int n = GetParam(); EXPECT_TRUE(IsPrime(n)); } INSTANTIATE_TEST_SUITE_P(PrimeValues, IsPrimeTest, ::testing::Values(2, 3, 5, 7, 11, 13, 17)); </syntaxhighlight> === 类型参数化测试 === 支持模板测试: <syntaxhighlight lang="cpp"> template <typename T> class VectorTest : public ::testing::Test {}; using MyTypes = ::testing::Types<int, float, double>; TYPED_TEST_SUITE(VectorTest, MyTypes); TYPED_TEST(VectorTest, InitialSizeIsZero) { std::vector<TypeParam> vec; EXPECT_EQ(vec.size(), 0); } </syntaxhighlight> == 实际应用案例 == === 数学库测试 === 验证矩阵运算库的正确性: <syntaxhighlight lang="cpp"> TEST(MatrixTest, Multiplication) { Matrix a = {{1, 2}, {3, 4}}; Matrix b = {{5, 6}, {7, 8}}; Matrix expected = {{19, 22}, {43, 50}}; Matrix result = Multiply(a, b); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { EXPECT_NEAR(result[i][j], expected[i][j], 1e-5); } } } </syntaxhighlight> === 网络协议测试 === 验证协议解析器: <syntaxhighlight lang="cpp"> TEST(ProtocolTest, ParsesValidPacket) { Packet p = ParsePacket("\x01\x02\x03\x04"); EXPECT_EQ(p.header, 0x01); EXPECT_EQ(p.length, 0x02); EXPECT_EQ(p.type, 0x03); EXPECT_EQ(p.checksum, 0x04); } TEST(ProtocolTest, ThrowsOnShortPacket) { EXPECT_THROW(ParsePacket("\x01\x02"), InvalidPacketError); } </syntaxhighlight> == 最佳实践 == * 测试命名应清晰表达测试目的 * 每个测试用例应聚焦单一功能点 * 优先使用<code>EXPECT_</code>而非<code>ASSERT_</code>以获取更多失败信息 * 测试应独立,不依赖执行顺序 * 定期运行测试(建议集成到CI/CD流程中) == 数学公式支持 == 当测试涉及数学计算时,可明确表达预期关系: <math> \sum_{i=1}^n i^2 = \frac{n(n+1)(2n+1)}{6} </math> 对应测试用例: <syntaxhighlight lang="cpp"> TEST(SumOfSquaresTest, ValidatesFormula) { int n = 10; int expected = n*(n+1)*(2*n+1)/6; EXPECT_EQ(SumOfSquares(n), expected); } </syntaxhighlight> == 调试技巧 == * 使用<code>--gtest_filter</code>运行特定测试 * <code>--gtest_repeat=N</code>重复测试N次 * <code>--gtest_break_on_failure</code>在失败时启动调试器 * 使用<code>SCOPED_TRACE</code>定位失败位置 通过系统学习GoogleTest,开发者可以构建健壮的测试体系,显著提高C++代码质量和可维护性。 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 调试与测试]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)