Compare commits

..

2 Commits

Author SHA1 Message Date
root e8ecd9f2bc 添加 tests/CMakeLists.txt 2026-04-28 08:59:41 +00:00
linianlin 1d069f92a2 AI 自动生成测试用例 2026-04-28 16:54:00 +08:00
3 changed files with 131 additions and 4 deletions

View File

@ -28,13 +28,13 @@ public:
// 查询追溯关系 // 查询追溯关系
std::vector<TraceLink> getTraceLinks(const std::string& req_id) const; std::vector<TraceLink> getTraceLinks(const std::string& req_id) const;
// 模拟 AST 构建与代码生成
std::string generateCppSkeleton(const RequirementItem& req);
std::string generateJavaSkeleton(const RequirementItem& req);
private: private:
std::vector<TraceLink> trace_index_; std::vector<TraceLink> trace_index_;
// 模拟 AST 构建与代码生成
std::string generateCppSkeleton(const RequirementItem& req);
std::string generateJavaSkeleton(const RequirementItem& req);
}; };
} // namespace aise } // namespace aise

29
tests/CMakeLists.txt Normal file
View File

@ -0,0 +1,29 @@
cmake_minimum_required(VERSION 3.10.0)
project(auto_plan_test)
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_directories(D:/workspace/googletest-demo/test_main)
#add_executable(demo max.cpp main.cpp)
# find_package使
find_package(GTest REQUIRED)
include(CTest)
enable_testing()
file(GLOB TEST_SOURCES "../*.cpp")
add_executable(auto_plan_test test_codegen.cpp ${TEST_SOURCES})
target_link_libraries(auto_plan_test gtest gmock gtest_main)
include(GoogleTest)
gtest_discover_tests(auto_plan_test)

98
tests/test_codegen.cpp Normal file
View File

@ -0,0 +1,98 @@
#include "aise/codegen.hpp"
#include <gtest/gtest.h>
#include <string>
#include <vector>
namespace aise {
class CodegenModuleTest : public ::testing::Test {
protected:
CodegenModule module;
};
FRIEND_TEST(CodegenModuleTest, testCodegenModuleConstructor);
FRIEND_TEST(CodegenModuleTest, testGenerateCppNormal);
FRIEND_TEST(CodegenModuleTest, testGenerateJavaNormal);
FRIEND_TEST(CodegenModuleTest, testGenerateUnsupportedLanguage);
FRIEND_TEST(CodegenModuleTest, testGenerateEmptyReqId);
FRIEND_TEST(CodegenModuleTest, testGetTraceLinksExisting);
FRIEND_TEST(CodegenModuleTest, testGetTraceLinksNonExisting);
FRIEND_TEST(CodegenModuleTest, testGenerateCppSkeletonNormal);
FRIEND_TEST(CodegenModuleTest, testGenerateJavaSkeletonNormal);
TEST_F(CodegenModuleTest, testCodegenModuleConstructor) {
auto links = module.getTraceLinks("SRS-AISE_F-001");
ASSERT_EQ(links.size(), 1);
EXPECT_EQ(links[0].req_id, "SRS-AISE_F-001");
EXPECT_EQ(links[0].file_path, "src/requirements.cpp");
EXPECT_FALSE(links[0].changed);
}
TEST_F(CodegenModuleTest, testGenerateCppNormal) {
auto result = module.generate("REQ-001", "C++", "x86");
EXPECT_TRUE(result.success);
ASSERT_EQ(result.generated_files.size(), 1);
EXPECT_EQ(result.generated_files[0], "REQ-001_impl.cpp");
ASSERT_EQ(result.trace_links.size(), 1);
EXPECT_EQ(result.trace_links[0].req_id, "REQ-001");
EXPECT_EQ(result.output_dir, "./generated/REQ-001");
}
TEST_F(CodegenModuleTest, testGenerateJavaNormal) {
auto result = module.generate("REQ-002", "Java", "ARM");
EXPECT_TRUE(result.success);
ASSERT_EQ(result.generated_files.size(), 1);
EXPECT_EQ(result.generated_files[0], "REQ-002_impl.java");
ASSERT_EQ(result.trace_links.size(), 1);
EXPECT_EQ(result.trace_links[0].req_id, "REQ-002");
}
TEST_F(CodegenModuleTest, testGenerateUnsupportedLanguage) {
auto result = module.generate("REQ-003", "Python", "x86");
EXPECT_FALSE(result.success);
EXPECT_EQ(result.error_msg, "Unsupported language: Python");
EXPECT_TRUE(result.generated_files.empty());
}
TEST_F(CodegenModuleTest, testGenerateEmptyReqId) {
auto result = module.generate("", "C++", "x86");
EXPECT_TRUE(result.success);
ASSERT_EQ(result.generated_files.size(), 1);
EXPECT_EQ(result.generated_files[0], "_impl.cpp");
}
TEST_F(CodegenModuleTest, testGetTraceLinksExisting) {
module.generate("REQ-001", "C++", "x86");
auto links = module.getTraceLinks("REQ-001");
ASSERT_EQ(links.size(), 1);
EXPECT_EQ(links[0].file_path, "REQ-001_impl.cpp");
}
TEST_F(CodegenModuleTest, testGetTraceLinksNonExisting) {
auto links = module.getTraceLinks("NONEXIST");
EXPECT_TRUE(links.empty());
}
TEST_F(CodegenModuleTest, testGenerateCppSkeletonNormal) {
RequirementItem req;
req.id = "REQ-TEST";
req.title = "Test Requirement";
req.description = "Test Desc";
std::string code = module.generateCppSkeleton(req);
EXPECT_THAT(code, testing::HasSubstr("// Requirement: REQ-TEST - Test Requirement"));
EXPECT_THAT(code, testing::HasSubstr("class REQModule"));
EXPECT_THAT(code, testing::HasSubstr("void execute()"));
}
TEST_F(CodegenModuleTest, testGenerateJavaSkeletonNormal) {
RequirementItem req;
req.id = "REQ-JAVA";
req.title = "Java Requirement";
req.description = "Java Desc";
std::string code = module.generateJavaSkeleton(req);
EXPECT_THAT(code, testing::HasSubstr("// Requirement: REQ-JAVA - Java Requirement"));
EXPECT_THAT(code, testing::HasSubstr("public class REQModule"));
EXPECT_THAT(code, testing::HasSubstr("System.out.println"));
}
} // namespace aise