From 62088c98e04491c1b5dd9147a284bd21fbd6c4e2 Mon Sep 17 00:00:00 2001 From: hzy <2322390005@qqq.com> Date: Thu, 14 May 2026 16:21:02 +0800 Subject: [PATCH] =?UTF-8?q?AI=20=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/CMakeLists.txt | 25 +++++++++++ tests/test_list_racks.cpp | 88 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/test_list_racks.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..5c9ae28 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.10.0) +project(test_ODF) +include(FetchContent) +if (MSVC) + add_compile_options(/utf-8) +endif() +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) + +include(CTest) +enable_testing() + +add_executable(test_ODF test_list_racks.cpp ../app/main.py) + +target_link_libraries(test_ODF gtest gmock gtest_main) +include(GoogleTest) +gtest_discover_tests(test_ODF) \ No newline at end of file diff --git a/tests/test_list_racks.cpp b/tests/test_list_racks.cpp new file mode 100644 index 0000000..9df7982 --- /dev/null +++ b/tests/test_list_racks.cpp @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include + +// 假设的数据结构 +struct RackListResponse { + std::string rack_id; + std::string rack_name; + int unit_count; +}; + +// 服务接口 +class Service { +public: + virtual ~Service() = default; + virtual std::vector list_racks() = 0; +}; + +// 全局服务指针(模拟原 Python 代码中的 service 模块) +Service* g_service = nullptr; + +// 被测函数:对应原 Python 中的 list_racks() +std::vector list_racks() { + return g_service->list_racks(); +} + +// Mock 服务类 +class MockService : public Service { +public: + MOCK_METHOD(std::vector, list_racks, (), (override)); +}; + +// 测试夹具 +class ListRacksTest : public ::testing::Test { +protected: + void SetUp() override { + mock_service = new MockService(); + g_service = mock_service; + } + + void TearDown() override { + delete mock_service; + g_service = nullptr; + } + + MockService* mock_service; +}; + +// 正常输入测试:返回非空机架列表 +TEST_F(ListRacksTest, testListRacksNormal) { + std::vector expected = { + {"rack-1", "机架A", 5}, + {"rack-2", "机架B", 3} + }; + + EXPECT_CALL(*mock_service, list_racks()) + .WillOnce(::testing::Return(expected)); + + auto result = list_racks(); + ASSERT_EQ(result.size(), 2); + EXPECT_EQ(result[0].rack_id, "rack-1"); + EXPECT_EQ(result[0].rack_name, "机架A"); + EXPECT_EQ(result[0].unit_count, 5); + EXPECT_EQ(result[1].rack_id, "rack-2"); + EXPECT_EQ(result[1].rack_name, "机架B"); + EXPECT_EQ(result[1].unit_count, 3); +} + +// 边界值测试:返回空列表 +TEST_F(ListRacksTest, testListRacksEmpty) { + std::vector empty; + + EXPECT_CALL(*mock_service, list_racks()) + .WillOnce(::testing::Return(empty)); + + auto result = list_racks(); + EXPECT_TRUE(result.empty()); +} + +// 异常输入测试:服务抛出异常 +TEST_F(ListRacksTest, testListRacksServiceThrows) { + EXPECT_CALL(*mock_service, list_racks()) + .WillOnce(::testing::Throw(std::runtime_error("database error"))); + + EXPECT_THROW(list_racks(), std::runtime_error); +}