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