AI 自动生成测试用例
This commit is contained in:
parent
3afea1e4c1
commit
b52552cd65
|
|
@ -0,0 +1,25 @@
|
||||||
|
cmake_minimum_required(VERSION 3.10.0)
|
||||||
|
project(test_task_plan)
|
||||||
|
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 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include)
|
||||||
|
|
||||||
|
include(CTest)
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
|
add_executable(test_task_plan test_app.cpp ../src/app.cpp)
|
||||||
|
|
||||||
|
target_link_libraries(test_task_plan gtest gmock gtest_main)
|
||||||
|
include(GoogleTest)
|
||||||
|
gtest_discover_tests(test_task_plan)
|
||||||
|
|
@ -0,0 +1,163 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
// 模拟 app.hpp 中的类型定义,确保测试文件可独立编译
|
||||||
|
namespace etms {
|
||||||
|
enum class EventStatus { Received, Processed, PendingTask, Rejected, TaskGenerated, Unknown };
|
||||||
|
struct Event {
|
||||||
|
int id; std::string event_id; std::string event_type; std::time_t timestamp;
|
||||||
|
int level; double longitude; double latitude; std::string description;
|
||||||
|
EventStatus status; std::time_t create_time;
|
||||||
|
};
|
||||||
|
struct KbVersion { std::string version_id; std::string description; std::time_t release_time; std::string status; };
|
||||||
|
struct TaskTemplate { std::string template_id; std::string name; std::string kb_version_id; std::string path; std::string applicable_type; std::time_t create_time; };
|
||||||
|
|
||||||
|
// 声明被测函数
|
||||||
|
std::vector<KbVersion> GetAvailableKbVersions();
|
||||||
|
std::vector<TaskTemplate> GetAvailableTemplates();
|
||||||
|
bool AdvanceEventStatus(Event& evt);
|
||||||
|
void SortEventsByLevelDesc(std::vector<Event>& events);
|
||||||
|
void SortEventsByTimeAsc(std::vector<Event>& events);
|
||||||
|
} // namespace etms
|
||||||
|
|
||||||
|
// ================= 测试用例实现 =================
|
||||||
|
|
||||||
|
// 1. GetAvailableKbVersions
|
||||||
|
TEST(testGetAvailableKbVersions, NormalInput_ReturnsThreeVersions) {
|
||||||
|
auto versions = etms::GetAvailableKbVersions();
|
||||||
|
EXPECT_EQ(versions.size(), 3);
|
||||||
|
EXPECT_EQ(versions[0].version_id, "KB-V1.0");
|
||||||
|
EXPECT_EQ(versions[1].version_id, "KB-V1.1");
|
||||||
|
EXPECT_EQ(versions[2].version_id, "KB-V2.0");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testGetAvailableKbVersions, Boundary_CheckStatusField) {
|
||||||
|
auto versions = etms::GetAvailableKbVersions();
|
||||||
|
EXPECT_EQ(versions[0].status, "Active");
|
||||||
|
EXPECT_EQ(versions[2].status, "Deprecated");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. GetAvailableTemplates
|
||||||
|
TEST(testGetAvailableTemplates, NormalInput_ReturnsThreeTemplates) {
|
||||||
|
auto templates = etms::GetAvailableTemplates();
|
||||||
|
EXPECT_EQ(templates.size(), 3);
|
||||||
|
EXPECT_EQ(templates[0].template_id, "TMPL-RECON-001");
|
||||||
|
EXPECT_EQ(templates[1].template_id, "TMPL-STRIKE-001");
|
||||||
|
EXPECT_EQ(templates[2].template_id, "TMPL-WARN-001");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testGetAvailableTemplates, Boundary_CheckApplicableType) {
|
||||||
|
auto templates = etms::GetAvailableTemplates();
|
||||||
|
EXPECT_EQ(templates[0].applicable_type, "侦察");
|
||||||
|
EXPECT_EQ(templates[1].applicable_type, "打击");
|
||||||
|
EXPECT_EQ(templates[2].applicable_type, "预警");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. AdvanceEventStatus
|
||||||
|
TEST(testAdvanceEventStatus, Normal_ReceivedToProcessed) {
|
||||||
|
etms::Event evt{};
|
||||||
|
evt.status = etms::EventStatus::Received;
|
||||||
|
EXPECT_TRUE(etms::AdvanceEventStatus(evt));
|
||||||
|
EXPECT_EQ(evt.status, etms::EventStatus::Processed);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testAdvanceEventStatus, Normal_ProcessedToPendingTask) {
|
||||||
|
etms::Event evt{};
|
||||||
|
evt.status = etms::EventStatus::Processed;
|
||||||
|
EXPECT_TRUE(etms::AdvanceEventStatus(evt));
|
||||||
|
EXPECT_EQ(evt.status, etms::EventStatus::PendingTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testAdvanceEventStatus, Normal_PendingTaskToTaskGenerated) {
|
||||||
|
etms::Event evt{};
|
||||||
|
evt.status = etms::EventStatus::PendingTask;
|
||||||
|
EXPECT_TRUE(etms::AdvanceEventStatus(evt));
|
||||||
|
EXPECT_EQ(evt.status, etms::EventStatus::TaskGenerated);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testAdvanceEventStatus, Abnormal_RejectedStateReturnsFalse) {
|
||||||
|
etms::Event evt{};
|
||||||
|
evt.status = etms::EventStatus::Rejected;
|
||||||
|
EXPECT_FALSE(etms::AdvanceEventStatus(evt));
|
||||||
|
EXPECT_EQ(evt.status, etms::EventStatus::Rejected);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testAdvanceEventStatus, Abnormal_TaskGeneratedStateReturnsFalse) {
|
||||||
|
etms::Event evt{};
|
||||||
|
evt.status = etms::EventStatus::TaskGenerated;
|
||||||
|
EXPECT_FALSE(etms::AdvanceEventStatus(evt));
|
||||||
|
EXPECT_EQ(evt.status, etms::EventStatus::TaskGenerated);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testAdvanceEventStatus, Abnormal_UnknownStateReturnsFalse) {
|
||||||
|
etms::Event evt{};
|
||||||
|
evt.status = etms::EventStatus::Unknown;
|
||||||
|
EXPECT_FALSE(etms::AdvanceEventStatus(evt));
|
||||||
|
EXPECT_EQ(evt.status, etms::EventStatus::Unknown);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. SortEventsByLevelDesc
|
||||||
|
TEST(testSortEventsByLevelDesc, Normal_UnsortedToDescending) {
|
||||||
|
std::vector<etms::Event> events = {
|
||||||
|
{1, "", "", 0, 5, 0, 0, "", etms::EventStatus::Received, 0},
|
||||||
|
{2, "", "", 0, 9, 0, 0, "", etms::EventStatus::Received, 0},
|
||||||
|
{3, "", "", 0, 7, 0, 0, "", etms::EventStatus::Received, 0}
|
||||||
|
};
|
||||||
|
etms::SortEventsByLevelDesc(events);
|
||||||
|
EXPECT_EQ(events[0].level, 9);
|
||||||
|
EXPECT_EQ(events[1].level, 7);
|
||||||
|
EXPECT_EQ(events[2].level, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testSortEventsByLevelDesc, Boundary_EmptyVector) {
|
||||||
|
std::vector<etms::Event> events;
|
||||||
|
etms::SortEventsByLevelDesc(events);
|
||||||
|
EXPECT_TRUE(events.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testSortEventsByLevelDesc, Special_DuplicateLevels) {
|
||||||
|
std::vector<etms::Event> events = {
|
||||||
|
{1, "", "", 0, 8, 0, 0, "", etms::EventStatus::Received, 0},
|
||||||
|
{2, "", "", 0, 8, 0, 0, "", etms::EventStatus::Received, 0},
|
||||||
|
{3, "", "", 0, 6, 0, 0, "", etms::EventStatus::Received, 0}
|
||||||
|
};
|
||||||
|
etms::SortEventsByLevelDesc(events);
|
||||||
|
EXPECT_EQ(events[0].level, 8);
|
||||||
|
EXPECT_EQ(events[1].level, 8);
|
||||||
|
EXPECT_EQ(events[2].level, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. SortEventsByTimeAsc
|
||||||
|
TEST(testSortEventsByTimeAsc, Normal_UnsortedToAscending) {
|
||||||
|
std::vector<etms::Event> events = {
|
||||||
|
{1, "", "", 100, 0, 0, 0, "", etms::EventStatus::Received, 0},
|
||||||
|
{2, "", "", 50, 0, 0, 0, "", etms::EventStatus::Received, 0},
|
||||||
|
{3, "", "", 150, 0, 0, 0, "", etms::EventStatus::Received, 0}
|
||||||
|
};
|
||||||
|
etms::SortEventsByTimeAsc(events);
|
||||||
|
EXPECT_EQ(events[0].timestamp, 50);
|
||||||
|
EXPECT_EQ(events[1].timestamp, 100);
|
||||||
|
EXPECT_EQ(events[2].timestamp, 150);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testSortEventsByTimeAsc, Boundary_SingleElement) {
|
||||||
|
std::vector<etms::Event> events = {
|
||||||
|
{1, "", "", 100, 0, 0, 0, "", etms::EventStatus::Received, 0}
|
||||||
|
};
|
||||||
|
etms::SortEventsByTimeAsc(events);
|
||||||
|
EXPECT_EQ(events.size(), 1);
|
||||||
|
EXPECT_EQ(events[0].timestamp, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(testSortEventsByTimeAsc, Special_AlreadySorted) {
|
||||||
|
std::vector<etms::Event> events = {
|
||||||
|
{1, "", "", 10, 0, 0, 0, "", etms::EventStatus::Received, 0},
|
||||||
|
{2, "", "", 20, 0, 0, 0, "", etms::EventStatus::Received, 0}
|
||||||
|
};
|
||||||
|
etms::SortEventsByTimeAsc(events);
|
||||||
|
EXPECT_EQ(events[0].timestamp, 10);
|
||||||
|
EXPECT_EQ(events[1].timestamp, 20);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue