GoogleTest 使用指南 | 基本测试准则
编写高质量的单元测试不仅依赖于正确使用测试框架,还需要遵循一些基本的测试准则。这些准则有助于确保测试的有效性、可维护性和可读性。
独立性
每个测试用例应独立于其他测试,无需依赖特定的执行顺序或共享状态。独立性确保测试结果的可靠性,避免因某个测试的失败影响其他测试。
不推荐的做法:
TEST(SharedStateTest, Initialize) {
global_state = initialize();
EXPECT_TRUE(global_state.is_initialized());
}
TEST(SharedStateTest, UseState) {
EXPECT_TRUE(global_state.is_initialized());
// 使用global_state进行测试
}
推荐的做法:
class StateTest : public ::testing::Test {
protected:
void SetUp() override {
state = initialize();
}
State state;
};
TEST_F(StateTest, Initialize) {
EXPECT_TRUE(state.is_initialized());
}
TEST_F(StateTest, UseState) {
EXPECT_TRUE(state.is_initialized());
// 使用state进行测试
}
清晰明了
测试用例应具有清晰的命名和结构,便于理解其目的和行为。命名应描述被测试的功能和预期的结果。
不推荐的做法:
TEST(AddTest1, Test1) {
EXPECT_EQ(add(1, 2), 3);
}
推荐的做法:
TEST(AdditionTest, HandlesPositiveNumbers) {
EXPECT_EQ(add(1, 2), 3);
}
高覆盖率
确保测试覆盖了代码的各种路径,包括正常情况、边界条件和异常情况。高覆盖率有助于发现隐藏的缺陷,提升代码质量。
快速反馈
测试应尽可能快速执行,以便开发者能够频繁运行测试,及时发现和修复问题。长时间运行的测试可能导致测试频率降低,影响开发效率。
优化策略:
- 避免不必要的初始化:减少测试夹具中的初始化步骤。
- 并行执行:利用 gTest 的并行测试功能,缩短整体测试时间。
- 分组测试:将耗时较长的测试与快速测试分开管理。
可维护性
测试代码应与生产代码一样注重可维护性。清晰的结构、良好的命名和适当的注释有助于长期维护和扩展测试。
建议:
- 模块化测试:按功能模块组织测试,用文件夹和命名区分不同模块的测试。
- 复用测试代码:使用测试夹具和辅助函数,减少重复代码。
- 定期重构:随着项目的发展,定期审查和优化测试代码,保持其整洁和高效。
2999

被折叠的 条评论
为什么被折叠?



