AI测试生成工具实测:qodo-cover vs GPT-4/Claude 3,谁更懂Java单元测试?
1. 项目概述:为什么我们需要关注AI测试生成工具?
作为一名在Java后端开发领域摸爬滚打了十多年的老码农,我经历过从纯手工编写JUnit测试,到使用Mockito、PowerMock等框架辅助,再到如今AI工具开始介入测试代码生成的整个变迁过程。最近,一个名为“qodo-cover”的AI测试生成工具开始在一些技术社区里被讨论,它宣称能针对Java代码自动生成高质量的单元测试。这让我产生了浓厚的兴趣:在GPT-4和Claude 3这两大顶级AI模型已经展现出强大代码生成能力的今天,一个垂直领域的专用工具,其表现究竟如何?是噱头还是真有独到之处?
简单来说,qodo-cover是一个专门为Java单元测试生成而设计的AI工具。它不像ChatGPT或Claude那样是一个通用的对话模型,而是聚焦于一个非常具体的场景:读取你的Java源代码(包括类、方法),理解其逻辑和依赖,然后自动生成配套的JUnit测试用例。这对于提升开发效率、保证代码覆盖率、尤其是在面对遗留系统或复杂业务逻辑时,具有显而易见的吸引力。本次评测,我将以一线开发者的视角,亲手使用qodo-cover,并横向对比直接使用GPT-4和Claude 3进行相同任务的表现,从实用性、准确性、可维护性等多个维度,为你呈现一份深度、客观的实测报告。
2. 评测环境与核心方法论设计
在开始“神仙打架”之前,我们必须建立一个公平、可复现的“擂台”。评测不是空谈感受,而是需要严谨的设计。
2.1 被测代码样本选择
我精心挑选了四段具有代表性的Java代码作为测试样本,覆盖了从基础到复杂的常见场景:
- 样本A:纯计算工具类 - 一个简单的
Calculator类,包含加、减、乘、除和取模方法。逻辑简单,无外部依赖。这是测试生成的“入门题”,用于检验工具对基础逻辑的理解。 - 样本B:包含外部依赖的服务类 - 一个
UserService类,内部依赖UserRepository(数据库访问)和EmailService(邮件发送)。方法中包含条件判断、异常抛出和对外部方法的调用。这是现实项目中最常见的场景,考验工具的Mock(模拟)和依赖注入理解能力。 - 样本C:复杂业务逻辑与异常流 - 一个
PaymentProcessor类,涉及订单状态校验、支付网关调用、手续费计算和多重异常处理(如InvalidOrderException,PaymentFailedException)。代码分支多,异常场景复杂,用于检验工具对边界条件和异常路径的覆盖能力。 - 样本D:使用了Java新特性的记录类 - 一个使用Java 14+
record关键字定义的Product不可变数据类,以及一个操作它的ProductCatalog类。用于观察工具对现代Java语法的支持情况。
2.2 评测工具与配置
- qodo-cover :从其官网获取最新版本(假设为v1.2.0)。它通常以IDE插件(如IntelliJ IDEA)或命令行工具的形式提供。评测中,我将其配置为针对每个样本代码所在的Maven/Gradle项目根目录运行。
- GPT-4 :使用OpenAI的GPT-4 API(模型版本
gpt-4-turbo-preview)。通过编程方式,将样本代码作为Prompt的一部分发送,请求其生成JUnit 5测试代码。Prompt经过精心设计,固定格式为:“你是一个资深的Java开发专家。请为以下Java类编写完整、可运行的JUnit 5单元测试。要求使用Mockito进行依赖模拟,并尽可能覆盖正常路径和关键异常路径。类代码如下:[此处粘贴代码]”。 - Claude 3 :使用Anthropic的Claude 3 Sonnet模型API。使用与GPT-4完全相同的Prompt和交互流程,以确保对比的公平性。
- 基础环境 :JDK 17, Maven 3.8+, JUnit 5.9+, Mockito 5.0+。所有生成的测试代码都将在此统一环境中编译和运行。
2.3 核心评测维度
我们将从以下几个开发者最关心的维度进行打分(每项1-5分):
- 生成速度与易用性 :从提供代码到获得测试用例的耗时和操作复杂度。qodo-cover作为专用工具,理论上应该更便捷。
- 代码编译通过率 :生成的测试代码能否在不做修改或仅做极少修改(如调整import语句顺序)的情况下,一次性编译通过。这是可用的底线。
- 逻辑正确性 :测试代码的逻辑是否与被测方法意图一致?Mock对象的行为设置是否正确?断言(Assert)是否验证了正确的预期结果?这是核心价值所在。
- 测试覆盖的完整性 :是否考虑了主要的业务分支、边界条件(如空值、零值、极限值)和异常场景?是否只是简单走个“Happy Path”?
- 代码质量与可维护性 :生成的测试代码本身是否清晰、可读?命名是否规范?是否遵循了良好的单元测试实践(如
Given-When-Then结构)?是否包含了必要的注释? - 对项目上下文的理解 :能否利用项目中的现有测试工具类、自定义注解或其他配置?还是生成了完全孤立、可能需要手动整合的代码?
注意 :本次评测侧重于工具在“生成”环节的能力。生成的测试用例在运行后是否全部通过,固然重要,但这很大程度上取决于被测代码本身是否正确。我们的前提是被测代码逻辑是正确的,因此更关注测试代码“是否正确地测试了预设的逻辑”。
3. 分样本深度实测与对比分析
接下来,我们进入实战环节,逐一剖析三个工具在面对不同挑战时的表现。
3.1 样本A:纯计算工具类评测
被测代码(Calculator.java):
public class Calculator {
public int add(int a, int b) { return a + b; }
public int subtract(int a, int b) { return a - b; }
public int multiply(int a, int b) { return a * b; }
public double divide(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("Divisor cannot be zero");
}
return (double) a / b;
}
public int modulo(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("Divisor cannot be zero");
}
return a % b;
}
}
qodo-cover 表现:
- 生成速度 :极快。在IDE中右键点击类文件,选择“Generate Tests with qodo-cover”,几乎在2秒内就在对应的test目录下生成了
CalculatorTest.java。 - 生成代码 :它生成的测试类结构非常标准。每个公有方法都对应一个测试方法。对于
divide和modulo,它 不仅 生成了参数为正数的正常情况测试(如divide(10,2)), 还自动生成了除数为零时的异常测试 ,使用了JUnit 5的assertThrows来验证是否抛出了IllegalArgumentException。这是第一个亮点。 - 代码质量 :测试方法命名规范(如
testAdd_PositiveNumbers),遵循了Given-When-Then的注释结构(虽然是用注释写的),可读性很好。没有多余的、花哨的代码。 - 评分 :
- 速度与易用性:5分
- 编译通过率:5分(直接通过)
- 逻辑正确性:5分
- 覆盖完整性:5分(覆盖了正常和异常边界)
- 代码质量:5分
- 上下文理解:5分(完美集成到项目结构)
GPT-4 表现:
- 生成速度 :通过API调用,响应时间在5-10秒左右,取决于网络。
- 生成代码 :生成的测试代码同样完整,包含了正常和除零异常测试。逻辑完全正确。代码风格也很不错,有时甚至会为测试方法生成JavaDoc注释。
- 细微差异 :我注意到GPT-4有时会“过度发挥”,比如在一个测试方法里同时测试多组不同输入参数(使用
@ParameterizedTest),这虽然更高效,但有时不符合团队要求的“一个测试方法一个明确场景”的规范。需要手动调整。 - 评分 :
- 速度与易用性:4分(需要手动复制粘贴代码)
- 编译通过率:4分(偶尔会有import错误,需修正)
- 逻辑正确性:5分
- 覆盖完整性:5分
- 代码质量:4分(有时过于“聪明”,风格需统一)
- 上下文理解:3分(生成的是独立的测试类,需要手动放入正确的test目录)
Claude 3 表现:
- 生成速度 :与GPT-4类似,约5-10秒。
- 生成代码 :表现非常稳健。生成的代码几乎与GPT-4不相上下,逻辑正确,覆盖全面。一个值得称道的细节是,Claude 3生成的代码在变量命名和断言信息上有时更“人性化”,例如断言失败信息是
“Expected result of 10 / 2 to be 5.0”,而不仅仅是assertEquals(5.0, result)。 - 评分 :各项评分与GPT-4高度相似,在代码质量上我主观给予4.5分,因为其错误信息更友好。
小结(样本A) :对于简单类,三者都是“满分优等生”。qodo-cover凭借其与IDE的深度集成和开箱即用的体验,在便捷性上完胜。GPT-4和Claude 3需要额外的“复制-粘贴-微调”步骤。
3.2 样本B:包含外部依赖的服务类评测
这是重头戏,也是区分工具能力的关键。
被测代码(UserService.java):
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private EmailService emailService;
public User registerUser(String username, String email) {
if (username == null || username.trim().isEmpty()) {
throw new IllegalArgumentException("Username cannot be null or empty");
}
if (userRepository.existsByUsername(username)) {
throw new RuntimeException("Username already exists");
}
User newUser = new User(username, email);
User savedUser = userRepository.save(newUser);
emailService.sendWelcomeEmail(savedUser.getEmail());
return savedUser;
}
}
qodo-cover 表现:
- 依赖识别与Mock :这是qodo-cover的“高光时刻”。它成功识别了
UserRepository和EmailService这两个被@Autowired注解的依赖。生成的测试类使用了@ExtendWith(MockitoExtension.class)注解,并正确地使用@Mock注解创建了这两个依赖的模拟对象,使用@InjectMocks创建了被测的UserService实例。完全符合Spring Boot项目中最常见的单元测试写法。 - 测试场景覆盖 :
- 生成了
registerUser_Success测试,模拟userRepository.existsByUsername返回false,userRepository.save返回一个存根用户,并验证了emailService.sendWelcomeEmail被调用了一次。 - 生成了
registerUser_UsernameIsNull_ThrowsException测试,验证传入空用户名时抛出IllegalArgumentException。 - 生成了
registerUser_UsernameAlreadyExists_ThrowsException测试,模拟existsByUsername返回true,验证抛出RuntimeException。
- 生成了
- 技巧与细节 :它甚至知道在验证
emailService被调用时,使用ArgumentMatchers.anyString()来匹配邮件地址参数,而不是写死一个值,这使测试更具弹性。 - 评分 :
- 速度与易用性:5分
- 编译通过率:5分
- 逻辑正确性:5分
- 覆盖完整性:5分(三条关键路径全了)
- 代码质量:5分(结构清晰,Mock使用得当)
- 上下文理解:5分(完美适配Spring测试风格)
GPT-4 表现:
- 依赖处理 :GPT-4同样能够生成使用Mockito的测试代码,结构正确。但是,在最初的生成结果中,它有时会混淆JUnit 4和JUnit 5的注解(比如用了
@RunWith(MockitoJUnitRunner.class)),在Prompt中明确要求JUnit 5后得以纠正。 - 场景覆盖 :逻辑覆盖与qodo-cover一致,三个主要场景都生成了。
- 存在的问题 :在测试“用户名已存在”的场景时,它生成的代码有时会先调用
userRepository.save,然后再验证异常,这逻辑是错误的,因为业务代码在save之前就会因existsByUsername为true而抛出异常。需要人工审查并纠正Mock行为的顺序。这是一个 关键的逻辑陷阱 。 - 评分 :
- 速度与易用性:4分
- 编译通过率:4分(需纠正注解)
- 逻辑正确性:4分(存在Mock顺序错误风险,需人工检查)
- 覆盖完整性:5分
- 代码质量:4分
- 上下文理解:4分
Claude 3 表现:
- 整体表现 :Claude 3的表现介于两者之间。它能生成正确的JUnit 5 + Mockito结构,Mock顺序也基本正确。
- 细微优势 :在异常测试的断言上,Claude 3有时会更细致,比如使用
assertThrows捕获异常后,还会对异常消息进行断言(assertEquals(“Username already exists”, exception.getMessage())),这增强了测试的严格性。 - 评分 :各项评分与GPT-4接近,但在逻辑正确性上,由于未发现Mock顺序错误,给予4.5分。
小结(样本B) :qodo-cover展现了其作为垂直工具的深厚功底,对Spring生态和测试模式的“理解”更加精准和自动化,几乎达到了“专家级”水平。GPT-4和Claude 3虽然也能完成任务,但需要开发者具备足够的单元测试知识去审核和纠正其中可能存在的、细微但关键的逻辑偏差。 对于复杂依赖场景,qodo-cover的可靠性显著更高。
3.3 样本C:复杂业务逻辑与异常流评测
这个样本旨在考验工具的“深思熟虑”程度。
被测代码(PaymentProcessor.java - 节选):
public class PaymentProcessor {
private PaymentGateway gateway;
private TaxCalculator taxCalculator;
public PaymentResult processPayment(Order order, PaymentMethod method) throws InvalidOrderException, PaymentFailedException {
// 1. 校验订单
if (order == null || !order.isValid()) {
throw new InvalidOrderException("Order is invalid");
}
if (order.getStatus() != OrderStatus.PENDING) {
throw new InvalidOrderException("Order is not in pending status");
}
// 2. 计算总额(含税)
double amount = order.getSubtotal();
double tax = taxCalculator.calculateTax(amount, order.getCustomerRegion());
double total = amount + tax;
// 3. 调用支付网关
GatewayResponse response = gateway.charge(total, method);
if (!response.isSuccess()) {
// 处理特定的网关错误码
if (response.getErrorCode() == GatewayError.INSUFFICIENT_FUNDS) {
throw new PaymentFailedException("Insufficient funds", response.getErrorCode());
} else {
throw new PaymentFailedException("Payment gateway error: " + response.getMessage(), response.getErrorCode());
}
}
// 4. 更新订单状态
order.setStatus(OrderStatus.PAID);
return new PaymentResult(order.getId(), total, response.getTransactionId());
}
}
qodo-cover 表现:
- 路径覆盖 :它成功地识别出了多个分支:
- 订单为null或无效 -> 抛出
InvalidOrderException。 - 订单状态非PENDING -> 抛出
InvalidOrderException。 - 正常流程,支付成功 -> 返回
PaymentResult。 - 支付失败,错误码为
INSUFFICIENT_FUNDS-> 抛出特定消息的PaymentFailedException。 - 支付失败,其他错误码 -> 抛出通用消息的
PaymentFailedException。
- 订单为null或无效 -> 抛出
- Mock配置 :它正确地Mock了
taxCalculator.calculateTax返回一个固定税额,也Mock了gateway.charge在不同测试中返回成功或失败的GatewayResponse对象。 - 不足 :对于“支付成功”的场景,它生成的断言主要集中在返回的
PaymentResult对象的总金额和订单ID上,但 没有验证order.setStatus(OrderStatus.PAID)这一副作用是否发生 。这是一个重要的遗漏,需要手动补充verify(order).setStatus(OrderStatus.PAID)这样的验证。 - 评分 :
- 覆盖完整性:4分(遗漏了状态更新的验证)
- 逻辑正确性:4分(同上)
- 其他维度与之前持平。
GPT-4 表现:
- 覆盖广度 :GPT-4生成的测试用例同样覆盖了上述5个主要路径。
- 深度与问题 :与qodo-cover类似,它也遗漏了对
order.setStatus的验证。此外,在模拟taxCalculator.calculateTax时,它有时会假设这个方法没有副作用,直接进行Mock。但如果TaxCalculator是一个复杂的、有状态的类,这种Mock可能不够真实。它生成的测试对于“其他错误码”的场景,有时只是笼统地抛出一个异常,没有细致地模拟不同的response.getMessage()。 - 评分 :覆盖完整性和逻辑正确性约3.5-4分,深度上略有欠缺。
Claude 3 表现:
- 表现分析 :Claude 3的表现与GPT-4高度相似。一个有趣的观察是,当Prompt中强调“尽可能覆盖关键异常路径”时,Claude 3似乎更倾向于为每个不同的异常条件生成独立的测试方法,使得测试报告更清晰。但在核心的Mock和断言完整性上,它与GPT-4面临相同挑战。
- 评分 :与GPT-4基本持平。
小结(样本C) :面对复杂的、有副作用的业务逻辑,三个工具都展现出了强大的路径分析能力,能生成覆盖主要分支的测试骨架。然而,它们都 无法完美地捕捉所有业务副作用和隐式契约 (比如状态更新)。这揭示了当前AI测试生成的共同局限:它们更像是极其高效的“测试代码起草员”,但最终的“审查与定稿”仍需具备深厚业务理解和测试经验的开发者来完成。qodo-cover在路径识别上更系统,但同样无法避免这个根本问题。
3.4 样本D:Java新特性支持评测
被测代码(Product.java & ProductCatalog.java):
// Product.java
public record Product(String id, String name, BigDecimal price) {}
// ProductCatalog.java
public class ProductCatalog {
private Map<String, Product> productMap = new ConcurrentHashMap<>();
public void addProduct(Product product) {
if (product == null || product.id() == null) { // 注意record的访问器是id(),不是getId()
throw new IllegalArgumentException("Product or product ID cannot be null");
}
productMap.put(product.id(), product);
}
public Optional<Product> findProductById(String id) {
return Optional.ofNullable(productMap.get(id));
}
public List<Product> getAllProductsSortedByPrice() {
return productMap.values().stream()
.sorted(Comparator.comparing(Product::price))
.collect(Collectors.toList());
}
}
评测焦点 :工具是否理解Java Record的特性?能否正确生成针对Record的测试?尤其是 Product::price 这种方-法引用。
结果汇总 :
- qodo-cover :完美支持。生成的测试代码中,能正确创建
Productrecord实例(new Product(“p1”, “Laptop”, new BigDecimal(“999.99”))),并在断言中正确使用product.price()和product.id()。对于getAllProductsSortedByPrice,生成的测试能创建多个产品并断言排序后的顺序正确。 - GPT-4 & Claude 3 :同样完美支持。它们对现代Java语法有很好的理解,生成的代码没有任何语法问题。在生成排序测试时,甚至能考虑到用
BigDecimal比较时使用compareTo。
小结(样本D) :在语言新特性支持上,三者都表现优异。这说明无论是通用大模型还是垂直工具,其底层语言模型对Java语法的理解都已相当成熟。
4. 综合评分与场景化选型建议
根据以上深度实测,我们可以给出一个综合评分表:
| 评测维度 | qodo-cover | GPT-4 | Claude 3 | 说明 |
|---|---|---|---|---|
| 生成速度与易用性 | ★★★★★ | ★★★☆☆ | ★★★☆☆ | qodo-cover与IDE无缝集成,一键生成,体验最佳。 |
| 代码编译通过率 | ★★★★★ | ★★★★☆ | ★★★★☆ | qodo-cover几乎100%通过;大模型偶尔需微调import。 |
| 逻辑正确性 | ★★★★☆ | ★★★☆☆ | ★★★★☆ | qodo-cover在依赖Mock顺序等细节上更准确;大模型需仔细审查。 |
| 覆盖完整性 | ★★★★☆ | ★★★★☆ | ★★★★☆ | 三者都能覆盖主要路径,但对复杂副作用覆盖不足。 |
| 代码质量与可读性 | ★★★★★ | ★★★★☆ | ★★★★☆ | qodo-cover代码风格更统一、规范;大模型有时过度发挥。 |
| 上下文理解 | ★★★★★ | ★★★☆☆ | ★★★☆☆ | qodo-cover能利用项目结构;大模型生成独立代码片段。 |
| 复杂依赖处理 | ★★★★★ | ★★★☆☆ | ★★★★☆ | qodo-cover对Spring/Mockito模式理解最深,可靠性高。 |
| 新语法支持 | ★★★★★ | ★★★★★ | ★★★★★ | 三者均表现良好。 |
| 成本 | 通常为商业许可 | API调用,按Token计费 | API调用,按Token计费 | qodo-cover有明确授权成本;大模型成本随使用量变化。 |
给不同开发者的选型建议:
-
追求极致效率与集成的团队/个人 : 首选 qodo-cover 。如果你所在团队重度使用Java和Spring Boot,且希望将测试生成无缝嵌入开发流程,qodo-cover能提供“开箱即用”的专家级体验,大幅降低编写基础测试用例的心智负担和机械劳动。它生成的代码更符合项目规范,节省了后期调整的时间。
-
技术探索者与全栈开发者 : 推荐 GPT-4 或 Claude 3 。如果你的工作涉及多种语言和技术栈,或者你需要AI辅助的任务远不止生成测试(还包括代码解释、重构建议、文档撰写等),那么通用大模型的多面手特性更具优势。你可以用同一个工具解决多种问题。但务必记住,在生成测试后,你需要扮演“资深审查者”的角色,仔细校验Mock行为和断言逻辑。
-
混合策略(推荐) :对于关键、核心的、包含复杂业务逻辑和依赖的服务类,使用 qodo-cover 生成高质量的基础测试骨架。对于工具类、工具方法、相对独立的函数,或者当你已经有了测试思路但不想手写时,可以快捷地使用 GPT-4/Claude 3 来辅助生成。同时,将大模型作为“高级代码审查伙伴”,让它帮你检查qodo-cover生成的测试中是否遗漏了重要的边界情况。
5. 实操心得与避坑指南
经过这一轮深度评测,我总结出一些宝贵的实操经验和需要警惕的“坑”。
5.1 无论用哪个工具,人工审查不可或缺
这是最重要的原则。AI生成的是“代码”,而不是“正确的测试”。它无法理解业务领域的深层含义和隐形规则。例如:
- 副作用验证 :如样本C中,工具可能遗漏对数据库状态变更、消息发送、缓存更新等副作用的验证(
verify调用)。 - 边界条件 :对于数值型参数,工具可能会测试0和正数,但容易遗漏负数、极大值、极小值(如
Integer.MAX_VALUE)。 - 时间相关逻辑 :如果方法中包含
new Date()或System.currentTimeMillis(),生成的测试可能会失败,因为预期结果是硬编码的。你需要使用Mockito的mockStatic或像Clock这样的可注入时间源。 - 并发安全 :工具几乎不会为
ConcurrentHashMap这类并发容器的操作生成并发测试。
我的经验 :将AI生成的测试视为第一稿。运行它,看它通过与否。然后,像审查别人代码一样仔细审查每一行:Mock设置对吗?所有重要的行为都断言了吗?异常场景都覆盖了吗?把这个过程固化为代码提交前的必要步骤。
5.2 如何为GPT-4/Claude 3编写更有效的Prompt
如果你选择使用通用大模型,Prompt工程至关重要:
- 明确框架和版本 :开头必须指明“使用JUnit 5和Mockito 5”。
- 指定代码风格 :“测试方法名采用驼峰命名,以‘test’开头或使用
@Test注解”。 - 要求覆盖场景 :“请覆盖正常成功场景、所有参数为null或空的异常场景、以及[某个特定业务]失败场景。”
- 提供上下文 :如果被测类依赖一个自定义异常或工具类,最好在Prompt中一并给出其简单定义。
- 迭代优化 :如果第一次生成的不满意,可以把生成的代码和你的反馈(如“Mock顺序错了,应该先A后B”)一起作为新的输入,让它修正。
5.3 qodo-cover的最佳实践与配置
- 配置检查 :首次使用时,检查其配置项。有些工具允许你指定喜欢的测试框架版本、Mock框架、断言库(AssertJ vs Hamcrest)以及是否生成
Given-When-Then注释。 - 聚焦于复杂类 :不要为简单的Getter/Setter或纯数据类生成测试,这没有意义。将工具用于那些包含条件逻辑、循环、异常处理或外部依赖的“有价值”的类。
- 与持续集成结合 :研究如何将qodo-cover集成到你的CI/CD流水线中。例如,能否在每次Pull Request时,针对改动的方法自动生成或更新测试用例?这能极大提升流程自动化水平。
5.4 成本与ROI考量
- qodo-cover :需要支付许可证费用。你需要计算它为你团队节省的时间是否远超其成本。对于测试文化浓厚、代码库庞大的团队,ROI通常很高。
- GPT-4/Claude 3 API :按Token计费。生成一个中等复杂类的测试,成本极低(通常不到1美分)。但如果你大规模、频繁使用,月度账单可能累积。需要监控使用量。
5.5 一个常见的误区:过度依赖与测试质量下降
最危险的陷阱是认为有了AI工具,就可以不再需要思考测试策略。这会导致生成大量浅层、重复的测试,而忽略了真正需要深入测试的核心复杂逻辑。AI是“副驾驶”,你才是掌握方向的“机长”。它负责减轻你的操作负担,但测试的目标、范围和深度,仍然需要由你来定义和把控。工具提升了“测试代码编写”的效率,但“测试设计”的智慧依然在开发者手中。
这次深度评测让我看到,AI在提升开发效率的征途上又迈出了坚实的一步。qodo-cover这样的垂直工具在特定场景下展现了惊人的成熟度,而GPT-4和Claude 3则继续证明其作为通用助手的强大潜力。我的建议是,不要非此即彼,而是根据具体场景,灵活组合使用这些工具,让它们成为你编码工具箱中锋利的新武器,同时始终保持你作为工程师的批判性思维和主导权。毕竟,写出真正保障软件质量的测试,最终依靠的还是我们对业务和代码的深刻理解。
更多推荐
所有评论(0)