GoogleTest 单元测试

假设我们有两个函数 complexFunction 和 helperFunction,其中 complexFunction 调用了 helperFunction。我们将编写测试 complexFunction 的单元测试,并在调用 helperFunction 的地方打桩。

cpp 复制代码
// 复杂函数示例
int helperFunction(int x) {
    return x * 2;
}

// 调用了 helperFunction 的复杂函数
int complexFunction(int a, int b) {
    if (a > 0) {
        for (int i = 0; i < a; ++i) {
            if (i % 2 == 0) {
                b += helperFunction(i);
            }
        }
    } else {
        b = -1;
    }

    return b;
}

现在,我们将编写一个单元测试来测试 complexFunction 并在调用 helperFunction 的地方打桩。

cpp 复制代码
#include <gtest/gtest.h>
#include <gmock/gmock.h>

// 导入要测试的函数
#include "complex_function.h" // 假设你的函数保存在 complex_function.h 文件中

// 引入命名空间
using ::testing::Return;

// 模拟 helperFunction 函数
class MockHelperFunction {
public:
    MOCK_METHOD(int, helperFunction, (int), (const));
};

// 单元测试套件
class ComplexFunctionTest : public ::testing::Test {
protected:
    // 在每个测试用例运行之前调用
    void SetUp() override {
        // 可以在这里进行初始化操作
    }

    // 在每个测试用例运行之后调用
    void TearDown() override {
        // 可以在这里进行资源释放等操作
    }

    // 模拟的 helperFunction
    MockHelperFunction mock_helper;
};

// 测试用例:测试 complexFunction 函数
TEST_F(ComplexFunctionTest, TestComplexFunction) {
    // 准备测试数据
    int a = 3, b = 2;
    // 设置预期调用
    EXPECT_CALL(mock_helper, helperFunction(::testing::_))
        .Times(3)
        .WillRepeatedly(Return(4)); // 模拟 helperFunction 返回值

    // 调用 complexFunction 函数
    int result = complexFunction(a, b);

    // 验证结果
    EXPECT_EQ(result, 14);
}

// 运行所有测试
int main(int argc, char **argv) {
    // 初始化 Google 测试
    ::testing::InitGoogleTest(&argc, argv);
    // 运行所有测试用例
    return RUN_ALL_TESTS();
}
cpp 复制代码
// 函数的测试
#include <gtest/gtest.h>
#include <array>

#include "geoalg.h"

TEST(Vector2DTest, Subtract) 
{
  const std::array<double, 2> v0 = {3.0, 4.0};
  const std::array<double, 2> v1 = {1.0, 2.0};
  std::array<double, 2> result = v0 - v1;
  std::array<double, 2> expected = {2.0, 2.0};
  EXPECT_EQ(result, expected);
}


TEST(Vector2DTest, Add) 
{
  const std::array<double, 2> v0 = {3.0, 4.0};
  const std::array<double, 2> v1 = {1.0, 2.0};
  std::array<double, 2> result = v0 + v1;
  std::array<double, 2> expected = {4.0, 6.0};
  EXPECT_EQ(result, expected);
}

TEST(Vector2DTest, MultiplyByScalar) 
{
  const std::array<double, 2> v = {3.0, 4.0};
  double a = 2.0;
  std::array<double, 2> result = a * v;
  std::array<double, 2> expected = {6.0, 8.0};
  EXPECT_EQ(result, expected);
}

TEST(Vector2DTest, DivideByScalar) 
{
  const std::array<double, 2> v = {6.0, 8.0};
  double a = 2.0;
  std::array<double, 2> result = v / a;
  std::array<double, 2> expected = {3.0, 4.0};
  EXPECT_EQ(result, expected);

  //double b = 0.0;
  //std::array<double, 2> u = {6.0, 8.0};
  //ASSERT_THROW({u / b;}, std::runtime_error);
  //ASSERT_THROW({u /= b;}, std::runtime_error);

}

TEST(Vector2DTest, CrossProduct) 
{
  const std::array<double, 2> v0 = {3.0, 4.0};
  const std::array<double, 2> v1 = {1.0, 2.0};
  double result = cross(v0, v1);
  EXPECT_EQ(result, 2.0);
}


TEST(Vector2DTest, DotProduct) 
{
  const std::array<double, 2> v0 = {3.0, 4.0};
  const std::array<double, 2> v1 = {1.0, 2.0};
  double result = dot(v0, v1);
  EXPECT_EQ(result, 11.0);
}

TEST(Vector2DTest, SquaredLength) 
{
  std::array<double, 2> v = {3.0, 4.0};
  double result = squared_length(v);
  EXPECT_EQ(result, 25.0);
}

TEST(Vector2DTest, Length) 
{
  const std::array<double, 2> v = {3.0, 4.0};
  double result = length(v);
  EXPECT_DOUBLE_EQ(result, 5.0);
}

TEST(Vector3DTest, CrossProduct)
{
  const std::array<double, 3> v0 = {1.0, 2.0, 3.0};
  const std::array<double, 3> v1 = {4.0, 5.0, 6.0};
  std::array<double, 3> result = cross(v0, v1);
  std::array<double, 3> expected = {-3.0, 6.0, -3.0};
  EXPECT_EQ(result, expected);

}

TEST(Vector3DTest, DotProduct) 
{
    const std::array<double, 3> v0 = {1.0, 2.0, 3.0};
    const std::array<double, 3> v1 = {4.0, 5.0, 6.0};
    double result = dot(v0, v1);
    double expected = 32.0;
    EXPECT_EQ(result, expected);
}

TEST(Vector3DTest, SquaredLength) {
  const std::array<double, 3> v = {3.0, 4.0, 12.0};
  double result = squared_length(v);
  double expected = 169.0;
  EXPECT_EQ(result, expected);
}

TEST(Vector3DTest, Length) 
{
  const std::array<double, 3> v = {3.0, 4.0, 12.0};
  double result = length(v);
  double expected = 13.0;
  EXPECT_EQ(result, expected);
}

TEST(VectorBarycenter, Barycenter) 
{
  const std::array<double, 3> p0 = {1.0, 2.0, 3.0};
  const std::array<double, 3> p1 = {4.0, 5.0, 6.0};
  const std::array<double, 3> p2 = {7.0, 8.0, 9.0};
  const std::array<double, 3> p3 = {10.0, 11.0, 12.0};

  std::array<double, 3> result = barycenter(p0, p1);
  std::array<double, 3> expected = {2.5, 3.5, 4.5};
  EXPECT_EQ(result, expected);
  
  result = barycenter(p0, p1, p2);
  expected = {4.0, 5.0, 6.0};
  EXPECT_EQ(result, expected);

  result = barycenter(p0, p1, p2, p3);
  expected = {6.5, 7.75, 9.0};
  EXPECT_EQ(result, expected);
}

   

add_executable(test_geoalg test_geoalg.cpp)
target_link_libraries(
  test_geoalg 
  GTest::gtest_main
  ${CSCEC_LIBRARIES}
)

 class TetMeshTest : public ::testing::Test
        {
            protected:
                void SetUp()
                {   
                    mesh.from_one_tetrahedron();
                    auto data = mesh.data();
                    std::cout << mesh << std::endl;
                }

            public:
                TetMesh mesh;
        }; // end of class

        TEST_F(TetMeshTest, NumberOfEntities)
        {
            EXPECT_EQ(mesh.number_of_nodes(),4);
            EXPECT_EQ(mesh.number_of_cells(),1);
        }
相关推荐
伊成2 天前
一文详解Spring Boot如何配置日志
java·spring boot·单元测试
文人sec2 天前
接口自动化测试设计思路--设计实战
python·https·单元测试·自动化·pytest
神探阿航3 天前
HNUST软件测试B考前最终复习
软件测试·单元测试·hnust·期中考试
csdn_freak_dd3 天前
查看单元测试覆盖率
java·单元测试
sheepfagdng6 天前
软件测试——用例篇(2)
功能测试·单元测试·测试用例·安全性测试
西洼工作室6 天前
掌握单元测试:提升软件质量的关键步骤
java·单元测试
上官箫羽7 天前
Spring Boot 单元测试使用教程(仅供参考)
java·spring boot·单元测试
oliveira-time10 天前
java单元测试代码
java·windows·单元测试
尽-欢10 天前
以太坊智能合约开发框架:Hardhat v2 核心功能从入门到基础教程
单元测试·区块链·智能合约
Allen Bright11 天前
【Java JUnit单元测试框架-60】深入理解JUnit:Java单元测试的艺术与实践
java·junit·单元测试