gtest 使用

背景:

在日常工作中,编写新的数据结构时,为了验证代码稳定性,需要编写测试用例,需要用的gtest开源框架。

  • gtest 安装

sudo apt-get install libgtest-dev
cd /usr/src/gtest
sudo cmake .
sudo make
cd lib
sudo cp libgtest*.a /usr/lib
  • CMakelists 配置

# 添加 Google Test
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
# 链接 Google Test 库
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GTEST_LIBRARIES})
  • Gtest 使用

Gtest 测试用例

      
#include "order_queue.hpp"
#include <gtest/gtest.h>

// 定义一个简单的测试结构
struct TestElement {
  float x;

  TestElement(float value = 0.0f) : x(value) {}
};

// 重载相等运算符,以用于比较
bool operator==(const TestElement &a, const TestElement &b) {
  return a.x == b.x;
}

class COrderQueueTest : public ::testing::Test {
protected:
  COrderQueue<TestElement, 5> queue;
};

TEST_F(COrderQueueTest, TestInitialState) {
  EXPECT_TRUE(queue.isEmpty());
  EXPECT_EQ(queue.size(), 0);
}

TEST_F(COrderQueueTest, TestPush) {
  queue.pushElement(TestElement(2.0f));
  EXPECT_EQ(queue.size(), 1);
  EXPECT_FALSE(queue.isEmpty());
  EXPECT_EQ(queue.getElement(0), TestElement(2.0f));

  queue.pushElement(TestElement(1.0f));
  EXPECT_EQ(queue.size(), 2);
  EXPECT_EQ(queue.getElement(0), TestElement(1.0f));
  EXPECT_EQ(queue.getElement(1), TestElement(2.0f));

  queue.pushElement(TestElement(3.0f));
  queue.pushElement(TestElement(0.0f));
  queue.pushElement(TestElement(4.0f));

  EXPECT_EQ(queue.size(), 5);
  EXPECT_EQ(queue.getElement(0), TestElement(0.0f));
  EXPECT_EQ(queue.getElement(1), TestElement(1.0f));
  EXPECT_EQ(queue.getElement(2), TestElement(2.0f));
  EXPECT_EQ(queue.getElement(3), TestElement(3.0f));
  EXPECT_EQ(queue.getElement(4), TestElement(4.0f));
}

TEST_F(COrderQueueTest, TestPop) {
  queue.pushElement(TestElement(1.0f));
  queue.pushElement(TestElement(2.0f));

  EXPECT_EQ(queue.size(), 2);
  queue.popElement();
  EXPECT_EQ(queue.size(), 1);
  EXPECT_EQ(queue.getElement(0), TestElement(2.0f));

  queue.popElement();
  EXPECT_TRUE(queue.isEmpty());
}

TEST_F(COrderQueueTest, TestGetAdjacentElement) {
  queue.pushElement(TestElement(0.0f));
  queue.pushElement(TestElement(2.0f));
  queue.pushElement(TestElement(4.0f));

  TestElement beforePoint, afterPoint;
  EXPECT_TRUE(queue.getAdjacentElement(2.0f, beforePoint, afterPoint));
  EXPECT_EQ(beforePoint, TestElement(0.0f));
  EXPECT_EQ(afterPoint, TestElement(2.0f));

  EXPECT_FALSE(queue.getAdjacentElement(-1.0f, beforePoint, afterPoint));
}

TEST_F(COrderQueueTest, TestOverflow) {
  queue.pushElement(TestElement(1.0f));
  queue.pushElement(TestElement(2.0f));
  queue.pushElement(TestElement(3.0f));
  queue.pushElement(TestElement(4.0f));
  queue.pushElement(TestElement(5.0f));

  // 这里会导致最旧的元素被替换
  queue.pushElement(TestElement(6.0f));

  EXPECT_EQ(queue.size(), 5);
  EXPECT_EQ(queue.getElement(0), TestElement(2.0f)); // 1.0f 被替换掉
  EXPECT_EQ(queue.getElement(1), TestElement(3.0f));
  EXPECT_EQ(queue.getElement(2), TestElement(4.0f));
  EXPECT_EQ(queue.getElement(3), TestElement(5.0f));
  EXPECT_EQ(queue.getElement(4), TestElement(6.0f));
}

    

函数调用:

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();

  return 0;
}

结果输出:

[==========] Running 5 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 5 tests from COrderQueueTest
[ RUN      ] COrderQueueTest.TestInitialState
[       OK ] COrderQueueTest.TestInitialState (0 ms)
[ RUN      ] COrderQueueTest.TestPush
[       OK ] COrderQueueTest.TestPush (0 ms)
[ RUN      ] COrderQueueTest.TestPop
[       OK ] COrderQueueTest.TestPop (0 ms)
[ RUN      ] COrderQueueTest.TestGetAdjacentElement
[       OK ] COrderQueueTest.TestGetAdjacentElement (0 ms)
[ RUN      ] COrderQueueTest.TestOverflow
[       OK ] COrderQueueTest.TestOverflow (0 ms)
[----------] 5 tests from COrderQueueTest (0 ms total)

[----------] Global test environment tear-down
[==========] 5 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 5 tests.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值