07 AI 写单元测试:一行代码不写给整个模块加测试

发布时间:2026/7/17 4:55:45
07 AI 写单元测试:一行代码不写给整个模块加测试 摘要本文分享了一套高效利用AI生成单元测试的四步法1提供标准测试模板让AI学习项目风格2逐个方法生成测试而非批量处理3让AI自动覆盖边界条件和异常场景4利用AI检查测试覆盖率查漏补缺。通过实际案例证明原本需要三天完成的17个Service方法单元测试使用该方法仅需两小时即可完成其中AI完成95%的编码工作开发者只需进行指令输入和结果确认。先交代一下背景我以前写过一篇关于「程序员为什么不爱写单元测试」的文章评论区一堆人说不是不爱写是写了也没人看公司也不考核花那时间干嘛。我承认这话有道理。但我现在想说的是如果写单元测试的时间从半天变成十分钟你写不写上周我接手了一个新模块里面有17个 Service 方法零单元测试。我老板的原话是「要不你补一下测试不着急给你三天。」我花了一下午研究这个模块的代码然后做了一个实验——用 AI 帮我把这17个方法的单元测试全部生成出来。从开始到全部跑通花了大约两小时。其中真正我动手的时间大概15分钟。剩下的时间是 AI 在写测试、我在看结果。今天就把这套流程拆开给你看。第一步给 AI 一个标准用例模板AI 写的测试默认是什么样的你试试直接说「帮我写单元测试」它会给你生成类似这样的代码Test void testCreateOrder() { // 各种 setup // 各种 mock // 各种 assert // 300行的测试方法 }不是不能用但太冗长了。你应该先给它一个模板告诉它你希望的测试风格。我的做法先把项目中写过的一个标准测试文件丢给 AI让 AI 学习这个风格。如果你项目里没有现成的测试直接给 AI 这个模板我项目里的单元测试风格是这样的后续的所有测试按这个风格写 SpringBootTest AutoConfigureMockMvc class UserServiceTest { Autowired private UserService userService; MockBean private UserMapper userMapper; Test void shouldCreateUser_whenValidInput() { // given User user new User(test, testexample.com); when(userMapper.insert(any())).thenReturn(1); // when Result result userService.createUser(user); // then assertThat(result.isSuccess()).isTrue(); verify(userMapper).insert(any()); } }然后把模板发给 AI说一句记住这个风格后面生成的测试都用这个模板AI 记住了。后续的测试生成它都会按这个模板来。你只需要确认就行。第二步让 AI 一个一个来别批量很多人犯的错误上来就把 17 个 Service 一起丢给 AI说「帮我把这些全写了」。AI 会非常热情然后给你 17 个文件的列表每个文件里只有一个测试方法——而且多半还是复制粘贴改了个名字。逐个生成才有效。我的做法现在帮我写 OrderService 的 createOrder 方法的单元测试。 需求订单创建成功后库存要扣减、优惠券要核销。 前置条件传入的订单参数合法。 业务逻辑校验商品 → 扣库存 → 核销优惠券 → 插入订单。 只写一个测试方法覆盖正常流程。AI 给我生成了这个Test void shouldCreateOrderSuccessfully() { // 准备数据 OrderCreateRequest request new OrderCreateRequest(); request.setProductId(1L); request.setQuantity(1); Product product new Product(); product.setId(1L); product.setStock(100); when(productService.checkAndLock(1L)).thenReturn(product); when(orderMapper.insert(any())).thenReturn(1); // 执行 Order result orderService.createOrder(request); // 验证 assertThat(result).isNotNull(); assertThat(result.getOrderNo()).isNotBlank(); verify(couponService).useCoupon(any()); verify(rabbitTemplate).convertAndSend(eq(order.delay), any()); }AI 帮我自动分析出了 createOrder 方法依赖了哪些服务、需要 mock 哪些依赖、执行后应该验证哪些行为。它读代码的能力远超我的想象。第三步让 AI 覆盖边界条件很多人的测试只覆盖「正常流程」对边界条件视而不见。但你让 AI 来做边界覆盖它比你勤快。正常流程的测试写完后我说再写几个测试覆盖这些边界条件 1. 商品库存不足时抛出异常 2. 优惠券已过期时抛出异常 3. 用户积分累计失败但订单不能回滚日志记录即可 4. 重复订单号的处理AI 一口气生成了四个测试Test void shouldThrowException_whenStockNotEnough() { OrderCreateRequest request new OrderCreateRequest(); request.setProductId(1L); request.setQuantity(999); Product product new Product(); product.setId(1L); product.setStock(10); // 库存只有10要买999 when(productService.checkAndLock(1L)).thenReturn(product); assertThatThrownBy(() -gt; orderService.createOrder(request)) .isInstanceOf(InsufficientStockException.class) .hasMessageContaining(库存不足); } Test void shouldNotRollback_whenPointsFailed() { // 积分失败只记录日志订单正常创建 OrderCreateRequest request new OrderCreateRequest(); request.setProductId(1L); request.setQuantity(1); Product product new Product(); product.setId(1L); product.setStock(100); when(productService.checkAndLock(1L)).thenReturn(product); doThrow(new RuntimeException(积分服务异常)) .when(pointService).addPoints(any(), anyInt()); when(orderMapper.insert(any())).thenReturn(1); Order result orderService.createOrder(request); assertThat(result).isNotNull(); // 积分失败也不影响订单创建 }AI 在分析代码的时候已经自动识别出了-productService.checkAndLock()的返回值代表库存状态 → 需要 mock 库存不足的场景-pointService.addPoints()被 try-catch 包裹 → 异常不会导致回滚 → 测试需要覆盖它读懂了代码的逻辑语义不是简单的语法分析。第四步让 AI 检查测试覆盖率测试写完了我让 AI 汇总一份报告帮我检查一下目前 OrderService 的测试覆盖了哪些方法哪些还没有覆盖AI 回复方法测试覆盖覆盖率createOrder✅ 正常 库存不足 优惠券过期 积分失败 重复订单5/5cancelOrder❌ 未覆盖0/3queryOrderDetail❌ 未覆盖0/2processTimeoutOrders❌ 未覆盖0/3数字摆在那一目了然。我把 cancelOrder 的接口签名和内部调用链发给 AI一分钟后又多了一个测试。总结17 个方法两小时跑通全部测试。其中 AI 写了大约 95% 的代码我主要做的事就是喂模板、发指令、确认结果。你需要的不是写测试的能力——你有。你需要的是让 AI 替你写测试的方法。四个步骤你记住就行1.给模板→ 让 AI 学习你的测试风格2.逐个方法→ 一次只生成一个方法的测试3.补边界→ 让 AI 覆盖正常流程之外的异常场景4.查遗漏→ 让 AI 检查测试覆盖了哪些方法下一个新功能写完花十分钟让 AI 给你补上测试。你不会后悔的。下一篇预告Cursor Rules 配置指南——让AI真正理解你的项目私信回复「666」一次性领走面试宝典Java 高频考点速查表、HashMap/ConcurrentHashMap 源码笔记、JVM 调优案例、Spring Boot 面试 50 问AI 编程工具箱Cursor/Copilot/Codex 六工具对比表、10 个 Prompt 模板、Debug 万能公式、Cursor 速查手册、AI 图片生成入门、30 效率工具包一份资料包两个专栏都能用。「唠点键盘之外的」只讲干货。