跳转至

C++ TDD 命令

此命令强制执行使用 CMake/CTest 和 GoogleTest/GoogleMock 的 C++ 代码测试驱动开发方法论。

此命令的工作方式

  1. 接口定义:先搭建类/函数签名的脚手架
  2. 编写测试:创建全面的 GoogleTest 测试用例(RED)
  3. 运行测试:验证测试因正确原因失败
  4. 实现代码:编写使测试通过的最小代码(GREEN)
  5. 重构:在保持测试绿色的同时改进代码
  6. 检查覆盖率:确保达到 80% 以上的覆盖率

使用时机

使用 /cpp-test 的时机: - 实现新的 C++ 函数或类时 - 为现有代码添加测试覆盖率时 - 修复 bug 时(先编写失败的测试) - 构建重要业务逻辑时 - 学习 C++ 中的 TDD 工作流时

TDD 循环

RED     → 失敗するGoogleTestテストを書く
GREEN   → テストを通す最小限のコードを実装
REFACTOR → コードを改善、テストはグリーンのまま
REPEAT  → 次のテストケースへ

测试模式

基本测试

TEST(SuiteName, TestName) {
    EXPECT_EQ(add(2, 3), 5);
    EXPECT_NE(result, nullptr);
    EXPECT_TRUE(is_valid);
    EXPECT_THROW(func(), std::invalid_argument);
}

测试夹具

class DatabaseTest : public ::testing::Test {
protected:
    void SetUp() override { db_ = create_test_db(); }
    void TearDown() override { db_.reset(); }
    std::unique_ptr<Database> db_;
};

TEST_F(DatabaseTest, InsertsRecord) {
    db_->insert("key", "value");
    EXPECT_EQ(db_->get("key"), "value");
}

参数化测试

class PrimeTest : public ::testing::TestWithParam<std::pair<int, bool>> {};

TEST_P(PrimeTest, ChecksPrimality) {
    auto [input, expected] = GetParam();
    EXPECT_EQ(is_prime(input), expected);
}

INSTANTIATE_TEST_SUITE_P(Primes, PrimeTest, ::testing::Values(
    std::make_pair(2, true),
    std::make_pair(4, false),
    std::make_pair(7, true)
));

覆盖率命令

# カバレッジ付きビルド
cmake -DCMAKE_CXX_FLAGS="--coverage" -DCMAKE_EXE_LINKER_FLAGS="--coverage" -B build

# テスト実行
cmake --build build && ctest --test-dir build

# カバレッジレポート生成
lcov --capture --directory build --output-file coverage.info
lcov --remove coverage.info '/usr/*' --output-file coverage.info
genhtml coverage.info --output-directory coverage_html

覆盖率目标

代码类型 目标
重要业务逻辑 100%
公共 API 90% 以上
一般代码 80% 以上
生成代码 排除

TDD 最佳实践

应该做: - 在实现之前先编写测试 - 每次更改后运行测试 - 在适当情况下,使用 EXPECT_*(继续)而不是 ASSERT_*(停止) - 测试行为而不是实现细节 - 包含边界情况(空、null、最大值、边界条件)

不应该做: - 在测试之前编写实现 - 跳过 RED 阶段 - 直接测试私有方法(通过公共 API 测试) - 在测试中使用 sleep - 忽略不稳定的测试

  • /cpp-build — 修复构建错误
  • /cpp-review — 实现后审查代码
  • verification-loop 技能 — 执行完整验证循环
  • 技能:skills/cpp-testing/
  • 技能:skills/tdd-workflow/

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC