GoogleTest 使用指南 | 使用命名空间组织测试
GoogleTest 使用指南 | 使用命名空间组织测试
在大型项目中,测试代码的组织尤为重要。合理使用命名空间,可以避免命名冲突,提升代码的可读性和维护性。
命名空间的优势
- 避免命名冲突:不同模块的测试用例可以在各自的命名空间中定义,避免同名测试用例的冲突。
- 提升可读性:通过命名空间明确测试用例所属的模块或功能,便于理解测试结构。
- 便于管理:命名空间可以按功能或模块分组,便于管理和维护测试代码。
命名空间的实现
calculator.h:
#pragma once
class Calculator {
public:
double add(double a, double b);
double subtract(double a, double b);
double multiply(double a, double b);
double divide(double a, double b);
int factorial(int n);
};
calculator.cpp:
#include "calculator.h"
#include <stdexcept>
double Calculator::add(double a, double b)
{
return a + b;
}
double Calculator::subtract(double a, double b)
{
return a - b;
}
double Calculator::multiply(double a, double b)
{
return a * b;
}
double Calculator::divide(double a, double b)
{
if (b == 0) {
throw std::invalid_argument("Division by zero");
}
return a / b;
}
int Calculator::factorial(int n)
{
if (n == 0 || n == 1)
return 1;
return factorial(n - 1) * n;
}
test_calculator_namespace.cpp:
#include "gtest/gtest.h"
#include "calculator.h"
#include <stdexcept>
namespace calculator_namespace_test {
class CalculatorNamespaceTest : public ::testing::Test {
protected:
Calculator calculator;
};
TEST_F(CalculatorNamespaceTest, Add) {
EXPECT_DOUBLE_EQ(calculator.add(2.0, 3.0), 5.0);
EXPECT_DOUBLE_EQ(calculator.add(-2.0, 3.0), 1.0);
}
TEST_F(CalculatorNamespaceTest, Subtract) {
EXPECT_DOUBLE_EQ(calculator.subtract(5.0, 3.0), 2.0);
EXPECT_DOUBLE_EQ(calculator.subtract(-2.0, -3.0), 1.0);
}
TEST_F(CalculatorNamespaceTest, Multiply) {
EXPECT_DOUBLE_EQ(calculator.multiply(4.0, 3.0), 12.0);
EXPECT_DOUBLE_EQ(calculator.multiply(-2.0, 3.0), -6.0);
}
TEST_F(CalculatorNamespaceTest, Divide) {
EXPECT_DOUBLE_EQ(calculator.divide(10.0, 2.0), 5.0);
EXPECT_THROW(calculator.divide(10.0, 0.0), std::invalid_argument);
}
TEST_F(CalculatorNamespaceTest, Factorial) {
EXPECT_EQ(calculator.factorial(0), 1);
EXPECT_EQ(calculator.factorial(1), 1);
EXPECT_EQ(calculator.factorial(5), 120);
}
} // namespace calculator_namespace_test
编译、执行测试:
cmake --build build --target test_calculator_namespace
ctest --test-dir build -R test_calculator_namespace --output-on-failure
测试结果:

多层命名空间
对于更复杂的项目,可以使用多层命名空间进行更细致的组织。
test_calculator_nested_namespace.cpp:
#include "gtest/gtest.h"
#include "calculator.h"
#include <stdexcept>
namespace calculator {
namespace add {
TEST(CalculatorAddTest, HandlesPositiveAndNegativeNumbers) {
Calculator calculator;
EXPECT_DOUBLE_EQ(calculator.add(1.5, 2.5), 4.0);
EXPECT_DOUBLE_EQ(calculator.add(-4.0, 6.0), 2.0);
}
} // namespace add
namespace subtract {
TEST(CalculatorSubtractTest, HandlesPositiveAndNegativeNumbers) {
Calculator calculator;
EXPECT_DOUBLE_EQ(calculator.subtract(8.0, 3.0), 5.0);
EXPECT_DOUBLE_EQ(calculator.subtract(-8.0, -3.0), -5.0);
}
} // namespace subtract
namespace multiply {
TEST(CalculatorMultiplyTest, HandlesPositiveAndNegativeNumbers) {
Calculator calculator;
EXPECT_DOUBLE_EQ(calculator.multiply(6.0, 7.0), 42.0);
EXPECT_DOUBLE_EQ(calculator.multiply(-3.0, 4.0), -12.0);
}
} // namespace multiply
namespace divide {
TEST(CalculatorDivideTest, HandlesValidInputAndDivisionByZero) {
Calculator calculator;
EXPECT_DOUBLE_EQ(calculator.divide(9.0, 3.0), 3.0);
EXPECT_THROW(calculator.divide(9.0, 0.0), std::invalid_argument);
}
} // namespace divide
namespace factorial {
TEST(CalculatorFactorialTest, HandlesZeroOneAndPositiveNumbers) {
Calculator calculator;
EXPECT_EQ(calculator.factorial(0), 1);
EXPECT_EQ(calculator.factorial(1), 1);
EXPECT_EQ(calculator.factorial(6), 720);
}
} // namespace factorial
} // namespace calculator
优势:
- 层级清晰:通过多层命名空间,明确测试用例所属的具体功能模块。
- 便于扩展:随着项目的发展,可以轻松添加更多的命名空间,组织更多的测试用例。
编译、执行测试:
cmake --build build --target test_calculator_nested_namespace
ctest --test-dir build -R test_calculator_nested_namespace --output-on-failure
测试结果:


4984

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



