背景:
在日常工作中,编写新的数据结构时,为了验证代码稳定性,需要编写测试用例,需要用的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.

3569

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



