C++ TDD 命令¶
此命令强制执行使用 CMake/CTest 和 GoogleTest/GoogleMock 的 C++ 代码测试驱动开发方法论。
此命令的工作方式¶
- 接口定义:先搭建类/函数签名的脚手架
- 编写测试:创建全面的 GoogleTest 测试用例(RED)
- 运行测试:验证测试因正确原因失败
- 实现代码:编写使测试通过的最小代码(GREEN)
- 重构:在保持测试绿色的同时改进代码
- 检查覆盖率:确保达到 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