AI 自动生成测试用例
This commit is contained in:
parent
f3cd8962e6
commit
62088c98e0
|
|
@ -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)
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <gmock/gmock.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
// 假设的数据结构
|
||||||
|
struct RackListResponse {
|
||||||
|
std::string rack_id;
|
||||||
|
std::string rack_name;
|
||||||
|
int unit_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 服务接口
|
||||||
|
class Service {
|
||||||
|
public:
|
||||||
|
virtual ~Service() = default;
|
||||||
|
virtual std::vector<RackListResponse> list_racks() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 全局服务指针(模拟原 Python 代码中的 service 模块)
|
||||||
|
Service* g_service = nullptr;
|
||||||
|
|
||||||
|
// 被测函数:对应原 Python 中的 list_racks()
|
||||||
|
std::vector<RackListResponse> list_racks() {
|
||||||
|
return g_service->list_racks();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mock 服务类
|
||||||
|
class MockService : public Service {
|
||||||
|
public:
|
||||||
|
MOCK_METHOD(std::vector<RackListResponse>, 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<RackListResponse> 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<RackListResponse> 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);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue