测试与调试
使用 Verdent 进行测试和调试的工作流
Verdent for VS Code 通过多轮生成-测试-修复循环、错误分析和自动化测试覆盖率改进,帮助你编写全面的测试并调试问题。生成与项目测试框架和风格相匹配的单元测试、集成测试和端到端测试。
你将学到
- 生成覆盖边界情况和预期行为的单元测试
- 使用所有主流测试框架(Jest、Pytest、JUnit 等)
- 创建验证多组件工作流的集成测试
- 通过识别并测试未覆盖的代码路径来提升测试覆盖率
- 使用错误信息分析和执行追踪进行问题调试
- 从堆栈跟踪、错误日志和异常行为中诊断 bug
前置条件
在使用 Verdent 进行测试和调试之前:
- 已安装 Verdent 扩展的 Visual Studio Code
- 在 VS Code 中打开的代码库或项目工作区
- 拥有可用积分的有效 Verdent 套餐
- 项目中已配置测试框架(生成测试时为可选项)
编写单元测试
Verdent 生成与项目测试框架和风格相匹配的单元测试。它会分析现有测试以理解你的模式,然后生成具有正确设置、断言和模拟的测试。
示例:
Write unit tests for the calculateDiscount functionVerdent 将:
- 检查
calculateDiscount函数的实现 - 识别输入参数和返回值
- 分析现有测试以匹配你的约定(测试结构、断言风格、命名模式)
- 生成涵盖以下内容的测试:
- 正常路径:有效输入及预期输出
- 边界情况:边界值、零、负数、最大值
- 无效输入:null、undefined、错误类型
- 预期行为:业务逻辑验证
生成的测试结构:
Verdent 按照项目模式创建测试:
- 测试套件组织:describe 块、测试类或模块结构
- 设置与拆解:与现有测试匹配的 before/after 钩子
- 断言:使用项目的断言库(expect、assert、should 等)
- 模拟:匹配你的模拟模式(jest.mock、sinon、unittest.mock)
- 命名约定:遵循你既有风格的测试名称
多轮生成-测试-修复循环:
为了实现全面测试,Verdent 使用多轮循环:
- 生成:创建初始测试套件
- 运行:执行测试以验证其有效性
- 修复:修正失败的测试或改进覆盖率
- 迭代:重复直到测试通过且覆盖率充足
这确保测试不仅被编写出来,而且能在你的代码库中真正正确运行。
Verdent 会分析你现有的测试以匹配你的约定。你现有的测试模式越一致,Verdent 生成的测试就越能契合项目风格。
支持的测试框架
Verdent 支持跨不同编程语言和技术栈的所有主流测试框架,无需额外配置。
单元测试框架:
test('sum returns correct result', () => {
expect(sum(2, 3)).toBe(5);
});const assert = require('assert');
describe('sum', () => {
it('returns correct result', () => {
assert.strictEqual(sum(2, 3), 5);
});
});import { describe, it, expect } from 'vitest';
it('sum returns correct result', () => {
expect(sum(2, 3)).toBe(5);
});describe('sum', () => {
it('returns correct result', () => {
expect(sum(2, 3)).toEqual(5);
});
});特定框架的测试:
- React Testing Library - 以用户为中心的 React 组件测试
- Vue Test Utils - 官方 Vue.js 测试库
端到端测试:
- Cypress - 端到端和组件测试
- Playwright - 跨浏览器端到端测试
- Puppeteer - 无头 Chrome 测试
- Pytest - 最流行的 Python 测试框架
- unittest - Python 内置测试框架
- nose2 - 通过插件扩展 unittest
- doctest - 嵌入在文档字符串中的测试
Verdent 生成具有正确 fixture、参数化和断言模式的测试,与你的 Python 测试风格相匹配。
- JUnit - 标准 Java 测试框架(JUnit 4、JUnit 5)
- TestNG - 具有高级功能的测试框架
- Mockito - Java 模拟框架
- AssertJ - 流式断言库
Verdent 创建带注解、生命周期方法和断言的测试,遵循 Java 测试约定。
- RSpec(Ruby)- 行为驱动开发框架
- PHPUnit(PHP)- PHP 单元测试框架
- Go testing(Go)- Go 内置测试包
- xUnit(C#/.NET)- .NET 测试框架
- Catch2(C++)- 现代 C++ 测试框架
Verdent 适配你所用语言的测试惯例,生成与项目约定相匹配的测试。
Verdent 会从项目配置和现有测试中识别你的测试框架,自动生成与你的设置相匹配的测试。
生成集成测试
Verdent 生成集成测试,验证多个组件、服务或模块如何协同工作。它创建模拟真实工作流的测试,包括 API 交互、数据库操作、认证流程和多步骤用户旅程。
示例:
Write integration tests for the user registration flowVerdent 生成验证完整流程的测试:
- 表单提交:用户使用有效数据提交注册表单
- 验证:后端验证邮箱格式、密码强度、数据完整性
- 数据库插入:在数据库中创建用户记录
- 发送邮件:发送确认邮件(模拟或实际发送)
- 成功登录:新用户可立即使用凭据登录
集成测试结构:
Verdent 创建包含以下内容的集成测试:
- 测试设置:数据库填充、服务初始化、测试数据创建
- 工作流模拟:按顺序执行的多步骤操作
- 状态验证:检查数据库状态、API 响应、副作用
- 模拟外部服务:邮件服务、支付 API、第三方集成
- 测试拆解:清理测试数据、数据库回滚、服务关闭
测试场景示例:
Write integration tests for the checkout and payment processVerdent 测试:
- 向购物车添加商品
- 应用折扣码
- 计算含税和运费的总额
- 处理支付(使用模拟支付网关)
- 在数据库中创建订单记录
- 发送确认邮件
- 更新库存
测试隔离:
Verdent 确保集成测试被正确隔离:
- 每个测试都以干净的数据库状态开始
- 模拟外部服务调用以防止副作用
- 测试可以以任意顺序运行,无依赖关系
- 即使测试失败也会执行清理
集成测试得益于隔离的测试环境,Verdent 可以帮助设置数据库 fixture 并模拟外部服务。
集成测试验证各组件能否正确协同工作。它们比单元测试更复杂,但能提供更高的信心,确保真实场景的工作流按预期运行。
提升测试覆盖率
Verdent 分析你的代码库,识别未测试的函数、分支和边界情况,然后生成测试以提升覆盖率。它会检查你现有的测试套件,找出代码路径未被覆盖的缺口。
示例:
Analyze test coverage and write tests for uncovered code paths in the payment moduleVerdent 将:
- 分析现有测试:检查当前已测试的内容
- 识别覆盖率缺口:找出缺少测试的具体函数、条件分支、错误处理路径和边界情况
- 生成缺失的测试:针对未覆盖的代码创建测试
- 验证覆盖率提升:运行测试以确认覆盖率提高
Verdent 识别的内容:
- 未测试的函数:完全没有测试覆盖的函数
- 条件分支:if/else 语句中某一分支未被测试
- 错误处理路径:没有失败测试的 try/catch 块或错误回调
- 边界情况:边界值、null/undefined 处理、类型强制转换
- 集成点:API 调用、数据库操作、外部服务交互
覆盖率提升示例:
Improve test coverage for the UserService classVerdent 识别出:
getUserById有针对有效 ID 的测试,但没有针对无效 ID 的测试updateUser缺少针对验证失败的测试deleteUser缺少针对授权检查的测试createUser中的错误处理路径未被测试
然后专门针对这些缺口生成测试,将覆盖率从 65% 提升到 95%。
覆盖率指标:
Verdent 帮助你达到更高的覆盖率百分比,并捕获此前未测试代码中的潜在 bug:
- 行覆盖率:被测试执行的代码行百分比
- 分支覆盖率:被测试的条件分支百分比
- 函数覆盖率:至少有一个测试的函数百分比
- 语句覆盖率:被执行的语句百分比
使用 Verdent 进行调试
Verdent 通过分析错误信息、追踪执行流程、识别根本原因并提出修复建议来协助调试。粘贴错误日志、描述异常行为,或要求 Verdent 调查特定问题。
描述出了什么问题以及你的预期:
This function returns undefined instead of the user object. Debug it.Verdent 将:
- 阅读函数实现
- 追踪执行流程
- 识别代码路径出错的位置(缺少 return 语句、错误的条件判断、async/await 问题)
- 提出修复方案并加以解释
- 建议防止回归的测试用例
示例:
The login form redirects to the home page even when credentials are invalidVerdent 将:
- 检查登录表单提交逻辑
- 追踪认证流程
- 识别 bug(重定向在异步验证完成之前发生)
- 提出修复方案(重定向前等待验证完成)
请求性能分析:
The product search is slow when the database has 10,000+ productsVerdent 将:
- 分析搜索查询的实现
- 识别低效之处(N+1 查询、缺少数据库索引、低效算法)
- 建议优化方案(添加数据库索引、批量查询、缓存结果)
性能调试帮助识别算法、数据库查询或 API 响应中拖慢应用的瓶颈。
理解代码如何执行:
Why does this API endpoint return a 500 error when the email parameter is missing?Verdent 将:
- 追踪从端点到验证再到数据库的请求处理过程
- 识别错误发生的位置(访问 undefined 的属性)
- 解释错误发生的原因(属性访问前缺少 null 检查)
- 建议防御性修复(使用参数前先进行验证)
执行流程追踪帮助你理解代码的执行路径以及它在何处偏离预期行为。
直接将错误信息或堆栈跟踪粘贴到聊天中。Verdent 会分析错误、定位有问题的代码,并通过具体的文件路径和行号解释出了什么问题。
从错误信息和日志中诊断
直接将错误信息、堆栈跟踪或日志文件粘贴到聊天中。Verdent 会分析错误、识别源文件和行号、解释原因并提出修复建议。
粘贴错误信息和堆栈跟踪:
TypeError: Cannot read property 'name' of undefined
at UserProfile.render (UserProfile.jsx:45)
at processComponent (react-dom.js:2103)将其粘贴到 Verdent 中:
I'm getting this error: [paste stack trace]Verdent 将:
- 识别错误类型(来自 null/undefined 访问的 TypeError)
- 定位确切行(
UserProfile.jsx:45) - 阅读该位置的代码
- 解释原因(数据加载前 user 对象为 undefined)
- 提出修复方案:
- 添加 null 检查:
if (!user) return <Loading /> - 使用可选链:
user?.name - 确保在渲染组件前数据已加载
- 添加 null 检查:
粘贴日志文件或控制台输出进行分析:
Analyze these logs and tell me why the API requests are failing:
[paste 50 lines of log output]Verdent 将:
- 扫描日志以查找错误模式
- 识别认证失败、网络超时或数据库错误
- 追踪导致失败的事件序列
- 根据错误模式建议修复方案
日志分析帮助识别多次失败之间的模式,并理解导致错误的事件序列。
对于复杂问题,Verdent 使用多步骤调试:
- 分析错误日志以识别失败点
- 阅读相关代码以理解实现
- 追踪执行流程以找出问题所在
- 建议修复方案并附带代码示例
- 生成测试以防止回归
示例:
The shopping cart total is sometimes incorrect. Here are the error logs: [paste logs]Verdent 将:
- 分析日志并识别 bug 何时发生(应用折扣码时)
- 阅读折扣计算逻辑
- 识别 bug(折扣在计税之前而非之后计算)
- 提出修复方案(重新排序计算步骤)
- 建议测试用例(含折扣的购物车、含税的购物车、两者兼有的购物车)
最佳实践
尽早生成测试
在开发功能的同时编写测试,而不是在完成之后。Verdent 可以在创建新函数或组件后立即生成测试。
将现有测试用作风格指南
Verdent 会匹配你项目的测试模式。保持一致的测试结构,以便 Verdent 生成符合你约定的测试。
明确要求针对边界情况的测试
要求 Verdent 测试边界条件、错误场景和异常输入:"编写包含针对无效输入和边界值的边界情况测试。"
直接粘贴错误信息
不要转述错误。粘贴完整的堆栈跟踪以获得准确的诊断和更快的解决方案。
描述预期行为与实际行为
调试时,清楚说明你期望发生什么以及实际发生了什么。这些上下文有助于 Verdent 识别根本原因。
对复杂功能使用多轮测试
对于关键功能,请求使用多轮循环进行全面的测试生成:"为支付模块生成全面的测试并验证它们全部通过。"
重构后进行测试
重构代码后,请求测试以验证功能得到保留:"生成测试以验证重构后的认证模块正常工作。"
将调试与测试生成结合
修复 bug 后,请求一个测试以防止回归:"编写一个确保此 bug 不再发生的测试。"