Armin Tavassoli-SE333最终项目
具有决策表测试生成和安全扫描的测试代理
对于我的SE333最终项目,我构建了一个MCP(模型上下文协议)服务器,它有助于自动化Java Maven项目的测试工作流程。主要功能是基于决策表的测试生成和安全漏洞扫描,以及覆盖率分析和Git自动化工具。
这有什么作用
该代理提供了一些关键功能:
- 基于决策表的测试生成:通过分析方法逻辑和创建涵盖不同决策路径的测试矩阵来生成JUnit测试用例
- 安全漏洞扫描:扫描Java代码以查找常见的安全问题,如SQL注入、XSS、命令注入等。
- 覆盖率分析:查找缺少测试覆盖率的代码,并建议测试什么
- Git自动化:处理常见的Git工作流,如暂存、提交和创建PR
特性
覆盖工具
find_jacoco_path:查找JaCoCo覆盖率报告的位置(HTML、XML或exec文件)missing_coverage:查看JaCoCo XML报告以查找未覆盖的代码并显示覆盖率统计数据
测试生成
generate_decision_table_tests:使用决策表创建JUnit测试。它
- 查看方法签名和逻辑 - 查找决策点(if/else、switch语句、三元运算符) - 构建一个包含以下内容的测试矩阵: - 空输入 - 空输入 - 有效输入 - 边界条件 - 边缘案例 - 异常情况
安全扫描
scan_security_vulnerabilities:扫描Java源代码以查找:
- SQL注入风险 - 命令注入漏洞 - 路径遍历问题 - 硬编码的秘密/密码 - 不安全的随机数生成 - 反序列化风险 - XSS漏洞 - 每个发现都按严重程度(高、中、低)分类
Git工具
git_status:显示上演、未上演和未跟踪的内容git_add_all:分阶段进行所有操作(跳过构建工件)git_commit:创建包含覆盖率统计信息的提交git_push:推送到远程仓库git_pull_request:创建PR(需要GitHub CLI,也可以手动完成)
设置
你需要的
- Python 3.12或更高版本
- Node.js 18+(LTS版本效果最好)
- VS代码与聊天视图
- Java 11+和Maven 3.6+
- Git和GitHub帐户
- uv包管理器(在此处安装)
安装步骤
- 安装uv
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"- 设置Python环境
cd Armin_Tavassoli_SE333_Final_project
uv init
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate- 安装依赖项
uv sync
# Or if that doesn't work:
uv add mcp fastmcp httpx pypdf python-dotenv- 将VS代码连接到MCP服务器
- 以HTTP模式启动服务器:
python server.py服务器将于启动 http://localhost:8001/sse (如果未设置MCP_port,则为端口8000) - 备注:VS Code的HTTP MCP客户端与FastMCP的SSE传输存在已知的兼容性问题。对于VS Code,您可以: - 选项A(建议用于VS代码):通过设置使用stdio模式 MCP_USE_STDIO=true 并配置VS Code以使用本地进程(请参阅 .vscode/settings.json) - 选项B:使用HTTP模式-服务器根据需要在HTTP上运行,但VS Code可能存在连接问题。HTTP模式适用于其他MCP客户端或使用curl进行测试。 - 在VS Code中,按 CTRL+SHIFT+P (或 CMD+SHIFT+P 在Mac上)并搜索“MCP:添加服务器” - 输入服务器URL: http://localhost:8001 (或 http://localhost:8000 如果使用默认端口) - 请将其命名为“SE333测试试剂” - 确保工具显示在聊天视图中
- 启用自动批准
- 按 CTRL+SHIFT+P 然后搜索“聊天:设置” - 启用自动批准 - 检查所有工具是否突出显示
- 设置Maven项目
cd codebase
mvn clean install
mvn test jacoco:report如何使用
基本工作流程
- 检查覆盖范围
- 使用 find_jacoco_path 查找报告 - 使用 missing_coverage 查看未涵盖的内容
- 生成测试
- 使用 generate_decision_table_tests 具有类名和方法名 - 例子: generate_decision_table_tests(class_name="org.apache.commons.lang3.StringUtils", method_name="isEmpty")
- 扫描安全问题
- 使用 scan_security_vulnerabilities 检查代码库 - 从高严重性问题开始
- Git工作流
- git_status → git_add_all → git_commit → git_push → git_pull_request
示例:生成测试
# In VS Code Chat:
generate_decision_table_tests(
class_name="org.apache.commons.lang3.StringUtils",
method_name="isEmpty",
input_parameters='{"str": "String"}'
)这将:
- 查看方法签名和代码
- 在逻辑中找到决策点
- 生成测试用例
- 为您提供可以保存的JUnit测试代码
示例:安全扫描
scan_security_vulnerabilities(
class_name="org.apache.commons.lang3.StringUtils",
severity="high"
)您将返回JSON:
- 发现了哪些漏洞
- 它们在哪里(文件和行)
- 它们有多严重
- 代码片段
- 如何修复它们
项目结构
Armin_Tavassoli_SE333_Final_project/
├── codebase/ # Apache Commons Lang3 Maven project
│ ├── pom.xml # Maven config with JaCoCo
│ ├── src/
│ │ ├── main/java/ # Source code
│ │ └── test/java/ # Test code
│ └── target/
│ └── site/jacoco/ # Coverage reports
├── .github/
│ └── prompts/
│ └── tester.prompt.md # Agent prompt config
├── server.py # MCP server code
├── pyproject.toml # Python dependencies
├── README.md # This file
├── demo/ # Demo materials
│ └── final_presentation.mp4 # Video (if applicable)
├── report/ # Written report
│ └── reflection.pdf # LaTeX reflection report
└── docs/ # Extra docs工具参考
find_jacoco_path
查找JaCoCo覆盖率报告在Maven项目中的位置。
输入:无
退货:报告文件的路径,如果尚未生成报告,则显示错误消息
示例:
find_jacoco_path()______________________________________________________________________
缺失_平均值
查看JaCoCo XML报告以查找测试未涵盖的代码。
输入:
class_name(可选):要检查的特定类
退货:JSON格式:
- 覆盖率摘要(行、分支、方法、类)
- 低覆盖率班级列表
- 关于测试内容的建议
示例:
missing_coverage(class_name="org.apache.commons.lang3.StringUtils")______________________________________________________________________
生成决策表测试
使用决策表生成JUnit测试用例。
输入:
class_name(必填):完整类名,如org.apache.commons.lang3.StringUtilsmethod_name(必填):测试方法input_parameters(可选):描述参数的JSON
退货:字符串形式的JUnit测试代码
示例:
generate_decision_table_tests(
class_name="org.apache.commons.lang3.StringUtils",
method_name="isEmpty"
)______________________________________________________________________
扫描安全漏洞
扫描Java代码是否存在安全问题。
输入:
class_name(可选):要扫描的特定类severity(可选):按“全部”、“高”、“中等”或“低”筛选
退货:JSON格式:
- 漏洞总数
- 按严重程度细分
- 每个的详细信息:
- 文件和行号 - 漏洞类型 - 严重性 - 描述 - 代码片段 - 如何修复它
示例:
scan_security_vulnerabilities(severity="high")______________________________________________________________________
Git工具
git_status
显示哪些文件已暂存、未暂存或未跟踪。
git_add_all
分阶段进行所有更改(构建工件除外)。
git_comit(消息)
创建一个commit。该消息将包括覆盖率统计数据(如果可用)。
git_push(远程,分支)
将提交推送到远程仓库。
git_pull_request(基础、标题、正文)
创建拉取请求。您需要安装GitHub CLI,也可以手动创建。
故障排除
服务器无法启动
如果 python server.py 失败:
- 检查Python版本:
python --version(需要3.12+) - 确保已安装依赖项:
uv sync - 检查虚拟环境是否已激活
- 查看端口8000是否已在使用中
找不到JaCoCo报告
如果 find_jacoco_path 表示未找到报告:
- 先运行测试:
cd codebase && mvn clean test - 生成报告:
mvn jacoco:report - 检查目录是否存在:
ls codebase/target/site/jacoco/
VS代码无法连接
如果聊天中没有显示工具:
- 确保服务器确实在运行(检查终端)
- 在VS代码设置中仔细检查服务器URL
- 尝试重新启动VS代码
- 确保启用了自动批准
- 检查服务器日志是否有任何错误
测试生成失败
如果 generate_decision_table_tests 给出错误:
- 确保类名是完全限定的(例如。,
org.apache.commons.lang3.StringUtils) - 检查方法名称拼写是否正确
- 验证源文件是否存在于
codebase/src/main/java/ - 确保文件可读
安全扫描未发现任何内容
如果 scan_security_vulnerabilities 返回空结果:
- 如果代码实际上是安全的,这可能没问题
- 尝试扫描特定类:
scan_security_vulnerabilities(class_name="...") - 尝试
severity="all"看到一切 - 确保Java文件在
codebase/src/main/java/
Git命令失败
如果Git工具返回错误:
- 确保Git已初始化:
git status - 检查您的Git凭据是否已设置
- 对于
git_pull_request:安装GitHub CLI(gh)或手动创建PR - 确保您具有对存储库的写访问权限
开发说明
添加新工具
如果要添加新的MCP工具:
- 使用创建函数
@mcp.tool()装饰器 - 写一个好的文档字符串
- 将工具名称添加到列表中
tester.prompt.md - 更新此自述文件
测试
要测试代理:
- 启动服务器:
python server.py - 在VS Code Chat中,逐一尝试每个工具
- 检查输出是否正确
- 尝试一些无效输入以测试错误处理
跟踪结果
覆盖指标
要跟踪覆盖率的提高,请使用JaCoCo报告。运行后 mvn test jacoco:report,您可以:
- 查看HTML报告:打开
codebase/target/site/jacoco/index.html在浏览器中 - 使用MCP工具:
- find_jacoco_path 查找报告 - missing_coverage 获取详细统计数据
报告显示:
- 线路覆盖率
- 分行覆盖率
- 方法覆盖率
- 班级覆盖率
用于演示:通过以下方式比较承保前后:
- 运行初始覆盖范围:
cd codebase && mvn clean test jacoco:report - 使用代理生成测试
- 再次运行覆盖范围:
mvn test jacoco:report - 比较指标
信息系统安全度量
跟踪安全改进:
- 发现的漏洞总数(使用
scan_security_vulnerabilities) - 按严重程度细分(高/中/低)
- 修复进度
- 受影响的文件
Git提交历史记录
如果你使用Git自动化工具,你可以通过提交历史记录来跟踪改进:
- 每个提交都包括覆盖率统计数据
- 查看提交消息以查看随时间推移的进度
- 使用
git log查看改进时间表
未来想法
稍后我想补充几点:
- 与突变检测(PIT)的整合
- 支持Java以外的其他语言
- 更好的测试用例优先级
- 自动化测试重构
- CI/CD集成
- 实时覆盖监控
- 更高级的安全模式检测
许可证
这是我在德保罗大学的SE333课程项目。
代码库(Apache Commons Lang3)使用Apache许可证2.0。
联系
学生:阿明·塔瓦索利\ 课程:SE333-软件代理\ 机构:德保罗大学
