用LLM做测试驱动开发:有趣又高效的尝试

  每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/

最近和同事讨论Tabby时,有人提到AI自动补全代码的潜在危害,比如因LLM(大型语言模型)的不可靠性导致代码质量下降,甚至滋生“意大利面条”代码,把像DRY这样的传统开发原则扔得一干二净。但本文的作者对此持不同意见:如果可以有一个框架,既能整合AI工具,又能让代码变得更可靠,会怎么样?这个想法让人瞬间联想到测试驱动开发(TDD)这种方法,尤其是结合LLM时的潜力。


TDD + LLM:从理想到现实的融合

TDD的核心思路是先写出覆盖全面的单元测试,再根据测试来实现主程序。理论上,测试本身就像完整的规范,所有测试通过则说明程序是正确的。然而,TDD在实践中被许多人认为拖慢了开发速度,甚至可能一无所获。LLM的出现,从经济效益上改变了这种状况。

在传统开发中,作者经常依赖像GitHub Copilot这样的工具来辅助编码。这些工具擅长识别模式并补全代码,但对深入理解需求、编写完整模块常常力不从心。为了让LLM高效工作,作者总结了一些经验:提出清晰的需求说明、逐步提供必要上下文、控制模型的注意力范围等。同时,LLM在调试方面表现优异——给出原始报错信息,它往往能猜出问题所在。

然而,频繁的切换窗口、复制粘贴上下文成了主要障碍。于是,作者尝试通过自动化脚本来简化整个流程。


自动化的TDD:工作流详解

作者写了一个简单的事件循环来自动化测试驱动开发:

  1. 定义需求与函数签名:第一步是向LLM提供明确的功能描述和函数签名,比如: go run main.go --spec '开发一个函数,输入一段长文本,识别并解析其中的IPv4、IPv6地址和CIDR块(这些可能夹杂在其他符号或文本之间),并将结果返回为列表' --sig 'func ParseCidrs(input string) ([]*net.IPNet, error)' 模型会生成初版实现和对应的单元测试。
  2. 沙箱验证:将生成的代码和测试放入沙箱目录,执行一系列工具(如go mod tidygo test)进行语法修复和单元测试。
  3. 迭代优化:如果初版测试失败,作者会将测试输出和相关代码反馈给模型,让其分析问题并修复代码。这一循环持续进行,直到所有测试通过。

通过这种方式,可以降低模型上下文的长度,节省成本,同时提高迭代效率。


模型的局限与对策

尽管方法有效,但也存在局限。例如,模型可能生成质量不高的测试用例,甚至误导开发者。为了解决这个问题,作者建议引入人工补充测试,并使用“变异测试”进一步验证代码的鲁棒性。具体做法是让LLM对代码进行一些微妙但关键的修改,测试是否能够捕捉到这些改动。


优化代码结构以适配LLM

为了让LLM更好地融入实际项目,作者提出了以下几点建议:

  1. 模块化设计:将每个目录拆分为独立可测试的子模块,每个模块包含:
    • shared.go:共享定义和全局变量;
    • x.go:单一功能的实现;
    • x_test.go:对应功能的测试。
  2. 提供上下文:为模型生成的代码提供必要的背景信息,如依赖文档和示例代码。
  3. 限制模型的工作范围:一次只让模型处理一个特定子目录,减少分心。

这种结构不仅能减少问题代码进入生产环境的风险,还鼓励代码解耦和单元测试优先的开发方式。最终,代码会趋于高内聚低耦合,既功能丰富,又易于维护。


结语:谨慎拥抱新工具

最后,作者提醒读者,AI技术更新日新月异,今天的优化方案可能很快被淘汰。因此,不必着急用这种方法重构已有的大型项目,但对于新项目来说,这是一种值得尝试的开发思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

你需要什么样的资源隔离?丨TiDB 资源隔离最佳实践

导读 资源隔离是数据库性能优化的重要环节, TiDB 在当前版本已经实现了从数据级隔离到流控隔离的全面升级 ,无论是多系统共享集群、复杂负载隔离,还是小型系统整合和 SQL 精细化控制,TiDB 都提供了灵活且高效的解决方案。 本文以…

1 行命令引发的 Go 应用崩溃

一、前言 不久前,阿里云 ARMS 团队、编译器团队、MSE 团队携手合作,共同发布并开源了 Go 语言的编译时自动插桩技术。该技术以其零侵入的特性,为 Go 应用提供了与 Java 监控能力相媲美的解决方案。开发者只需将 go build 替换为新编译命令 o…

Python毕业设计选题:基于django+vue的宠物服务管理系统

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 宠物商品管理 医疗服务管理 美容服务管理 系统…

Java连接TDengine和MySQL双数据源

git文件地址:项目首页 - SpringBoot连接TDengine和MySQL双数据源:SpringBoot连接TDengine和MySQL双数据源 - GitCode 1、yml配置 spring:datasource:druid:mysql:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/testusername: roo…

三十一、事件过滤处理分析

三十一、事件过滤处理分析eventFilter 实现以下功能 bool QObject::eventFilter(QObject *watched, QEvent *event): 如果已将此对象安装为所监视对象的事件过滤器,则过滤事件。 在你重新实现这个函数时,如果你想过滤掉事件,即停…

C++ QT中Q_Q和Q_D是什么?怎么使用?本质是什么?C++仿写

1.QT中Q_Q和Q_D是什么&#xff1f; Q_Q可以得到外部可以访问的类指针Q_D可以得到内部封装&#xff0c;外部不可达的类指针 2. 怎么使用&#xff1f; 上代码 APrivate.h #pragma once #include <QtCore>class A;class APrivate {Q_DECLARE_PUBLIC(A) public:APrivate(…

三种文本相似计算方法:规则、向量与大模型裁判

文本相似计算 项目背景 目前有众多工作需要评估字符串之间的相似(相关)程度&#xff1a;  比如&#xff0c;RAG 智能问答系统文本召回阶段需要计算用户文本与文本库内文本的相似分数&#xff0c;返回前TopK个候选文本。  在评估大模型生成的文本阶段&#xff0c;也需要评估…

高效实现 Markdown 转 PDF 的跨平台指南20250117

高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐&#xff0c;但如何将其转换为易于分享和打印的 PDF 格式&#xff0c;是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法&#xff0c;并探讨…

浅谈云计算21 | Docker容器技术

Docker容器技术 一、 容器技术特性1.1 轻量级特性1.2 隔离性特性 二、容器镜像2.1 容器镜像概述2.1.1 定义与构成2.1.2 分层结构 2.2 联合文件系统2.3 容器镜像的构建与管理2.3.1 容器镜像的构建2.3.2 **构建镜像流程**2.3.3 **应用场景**2.3.4 镜像仓库的应用 2.4 容器镜像的优…

LabVIEW实现油浸式变压器自主监测与实时报告

油浸式变压器广泛应用于电力系统中&#xff0c;尤其是在电力传输和分配领域。为了确保变压器的安全、稳定运行&#xff0c;及时监测其工作状态至关重要。传统的变压器监测方法通常依赖人工巡检和定期检查&#xff0c;但这不能及时发现潜在的故障隐患&#xff0c;且效率较低。随…

【2025最新】国内中文版 ChatGPT镜像网站整理合集,GPT最新模型4o1,4o,4o-mini分类区别,镜像站是什么

1.快速导航 原生中转型镜像站点 立即Chat支持GPT4、4o以及o1,canvs等&#xff0c;同步官网功能 AIChat.com 支持最新4O 2.两者对比 官网立即Chat访问难度需要魔法直接访问支付手段国际支付国内支付封禁策略检测节点&#xff0c;随时封禁不会封禁价格每月140元订阅费用每年70元…

SpringBoot:RestTemplate与IllegalArgumentException

问题描述 在SpringBoot应用中&#xff0c;有时会遇到使用RestTemplate调用第三方服务的场景。例如&#xff1a;在进行地名数据采集时&#xff0c;为了拿到地名对应的经纬度位置&#xff0c;通常会有地理编码的步骤&#xff0c;此时就可能涉及到调用第三方接口服务实现此需求。 …

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} &#xff0c; HTML中想要保留 \n的换行效果的有下面3种方法&#xff1a; 1、style 中 设置 white-space: pre-lin…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…

基于预共享密钥的IPsec实验

一、实验目的 &#xff08;1&#xff09;了解IPsec的原理和协议运行机制&#xff1b; &#xff08;2&#xff09;掌握IPsec身份认证的预共享密钥的配置&#xff1b; &#xff08;3&#xff09;掌握用Wireshark工具抓包分析IPsec数据包格式和协议流程。 二、实验设备与环境 &…

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…

初学stm32 --- flash模仿eeprom

目录 STM32内部FLASH简介 内部FLASH构成&#xff08;F1&#xff09; FLASH读写过程&#xff08;F1&#xff09; 闪存的读取 闪存的写入 内部FLASH构成&#xff08;F4 / F7 / H7&#xff09; FLASH读写过程&#xff08;F4 / F7 / H7&#xff09; 闪存的读取 闪存的写入 …

Kinova仿生机械臂Gen3搭载BOTA 力矩传感器SeneOne:彰显机器人触觉 AI 与六维力传感的融合力量

随着工业4.0时代的到来&#xff0c;自动化和智能化成为制造业的趋势。机器人作为实现这一趋势的重要工具&#xff0c;其性能和智能水平直接影响到生产效率和产品质量。然而&#xff0c;传统的机器人系统在应对复杂任务时往往缺乏足够的灵活性和适应性。为了解决这一问题&#x…

浅谈计算机网络03 | 现代网络组成

现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…