使用说明
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.pyhttp://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进行测试。
- 选项A(建议用于VS代码):通过设置使用stdio模式
- 在VS Code中,按
CTRL+SHIFT+P(或CMD+SHIFT+P在Mac上)并搜索“MCP:添加服务器” - 输入服务器URL:
http://localhost:8001(或http://localhost:8000如果使用默认端口) - 请将其命名为“SE333测试试剂”
- 确保工具显示在聊天视图中
- 以HTTP模式启动服务器:
-
启用自动批准
- 按
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-软件代理
机构:德保罗大学
