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);
        }
相关推荐
许彰午14 天前
39_Java单元测试JUnit入门
java·junit·单元测试
果子耶耶14 天前
让大模型帮我写单元测试,5个模型的覆盖率和边界处理能力实测
chatgpt·单元测试
川石课堂软件测试15 天前
APP自动化测试|高级手势操作&toast操作
css·功能测试·测试工具·microsoft·fiddler·单元测试·harmonyos
Thecozzy17 天前
单元测试 vs 手工测试:以水印功能为例
单元测试
HLAIA光子18 天前
AI Coding框架,打好TDD和SDD这两拳
单元测试·ai编程·代码规范
霸道流氓气质18 天前
Java 单元测试生成大量 Excel 测试数据实战指南
java·单元测试·excel
川石课堂软件测试18 天前
UI自动化测试|下拉选择框&弹出框&滚动条操作实践
开发语言·python·jmeter·ui·docker·单元测试·harmonyos
川石课堂软件测试19 天前
UI自动化测试|元素操作&浏览器操作实践
功能测试·测试工具·mysql·ui·docker·容器·单元测试
无聊的老谢19 天前
电信系统中的单元测试策略:构建高可靠性的微服务防线
数据库·微服务·单元测试