GoogleTest 使用指南 | 使用命名空间组织测试

GoogleTest 使用指南 | 使用命名空间组织测试

在大型项目中,测试代码的组织尤为重要。合理使用命名空间,可以避免命名冲突,提升代码的可读性和维护性。

命名空间的优势

  1. 避免命名冲突:不同模块的测试用例可以在各自的命名空间中定义,避免同名测试用例的冲突。
  2. 提升可读性:通过命名空间明确测试用例所属的模块或功能,便于理解测试结构。
  3. 便于管理:命名空间可以按功能或模块分组,便于管理和维护测试代码。

命名空间的实现

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

测试结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值