ChatUniTest:一个基于 ChatGPT 的 Java 单元测试自动生成工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
coderchenzhi
V2EX    分享创造

ChatUniTest:一个基于 ChatGPT 的 Java 单元测试自动生成工具

  •  
      coderchenzhi 2023-07-17 16:06:43 +08:00 1788 次点击
    这是一个创建于 895 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介:

    相信很多人试过用 ChatGPT 帮助自己完成各种各样的编程任务,并且已经取得了不错的效果。但是,直接使用 ChatGPT 存在一些问题:一是生成的代码很多时候不能正常执行,“编程五分钟,调试两小时”;二是不方便跟现有工程进行集成,需要手动与 ChatGPT 进行交互,并且在不同页面间切换。为了解决这些问题,我们提出了“生成-验证-修复”框架,并实现了原型系统,同时为了方便大家使用,我们开发了一些插件,能够方便的集成到已有开发流程中。

    已完成 Maven 插件开发( https://github.com/ZJU-ACES-ISE/chatunitest-maven-plugin ),最新版 1.1.0 已发布到 Maven 中心仓库,欢迎试用和反馈。IDEA 插件正在开发中,欢迎持续关注。

    联系人:智晨

    主要开发人员:陈膺浩、吴孜璇、谢卓魁

    浙江大学 ACES 实验室

    原理:

    原理图

    针对待测方法,首先收集一些待测方法中必要的上下文信息,让 ChatGPT 进行初始生成,然后验证 ChatGPT 生成的测试用例是否正确,如果不正确,则根据编译器的报错信息进行修复,其中,对于一些常见的简单错误,使用预定义规则进行修复,对于其余错误,则让 ChatGPT 修复测试用例,如此循环迭代,直至测试用例正确执行,或者达到最大迭代次数。

    使用:

    1. 将以下依赖项添加到pom.xml文件中

      <dependency> <groupId>io.github.ZJU-ACES-ISE</groupId> <artifactId>chatunitest-starter</artifactId> <version>1.0.0</version> <type>pom</type> </dependency> 
    2. 在项目的pom.xml文件内加入 chatunitest-maven-plugin 的插件配置,并按照您的需求添加参数:

      <plugin> <groupId>io.github.ZJU-ACES-ISE</groupId> <artifactId>chatunitest-maven-plugin</artifactId> <version>1.1.0</version> <configuration> <!-- Required: You must specify your OpenAI API keys. --> <apiKeys></apiKeys> <model>gpt-3.5-turbo</model> <testNumber>5</testNumber> <maxRounds>5</maxRounds> <minErrorTokens>500</minErrorTokens> <temperature>0.5</temperature> <topP>1</topP> <frequencyPenalty>0</frequencyPenalty> <presencePenalty>0</presencePenalty> <proxy>${proxy}</proxy> </configuration> </plugin> 

      下面是每个配置选项的详细说明:

      • apiKeys: (必需) 您的 OpenAI API keys ,示例:Key1, Key2, ...
      • model: (可选) OpenAI 模型,默认值:gpt-3.5-turbo
      • testNumber: (可选) 每个方法的生成的测试数量,默认值:5
      • maxRounds: (可选) 修复过程的最大轮次,默认值:5
      • minErrorTokens: (可选) 修复过程中错误信息的最小 token 数,默认值:500
      • temperature: (可选) OpenAI API 参数,默认值:0.5
      • topP: (可选) OpenAI API 参数,默认值: 1
      • frequencyPenalty: (可选) OpenAI API 参数,默认值: 0
      • presencePenalty: (可选) OpenAI API 参数,默认值: 0
      • proxy: (可选)如果需要,填写您的主机名和端口号,示例:127.0.0.1:7078
      • selectClass: (可选) 被测试的类,如果项目中有同名类,需要指定完整的类名。
      • selectMethod: (可选) 被测试的方法
      • tmpOutput: (可选) 解析项目信息的输出路径,默认值: /tmp/chatunitest-info
      • testOutput: (可选) 由 chatunitest生成的测试的输出路径,默认值:{basedir}/chatunitest
      • project: (可选) 目标项目路径,默认值:{basedir}
      • thread: (可选) 开启或关闭多线程,默认值:true
      • maxThread: (可选) 最大线程数,默认值:CPU 核心数 * 5
      • stopWhenSuccess: (可选) 是否在生成一个成功的测试后停止,默认值:true
      • noExecution: (可选) 是否跳过执行测试验证的步骤,默认值:false

      一般情况下,您只需要提供 OPENAI 的 API 密钥。

    3. 通过运行 mvn compilemvn install 命令下载所需的依赖。

    4. 使用以下命令运行插件:

      1 ) 为目标方法生成单元测试:

      mvn chatunitest:method -DselectMethod=className#methodName 

      2 ) 为目标类生成单元测试:

      mvn chatunitest:class -DselectClass=className 

      当执行 mvn chatunitest:methodmvn chatunitest:class 命令时,您必须指定 selectMethodselectClass,可以使用 -D 选项来实现这一点。在 pom 文件中配置的所有参数都可以使用 -D 选项在命令行指定。

      3 ) 为整个项目生成单元测试:(警告:对于大型项目来说,可能会消耗大量的 token ,导致相当大的费用。

      mvn chatunitest:project 

      4 ) 清理生成的测试代码:

      mvn chatunitest:clean 

      运行该命令将删除所有生成的测试代码并恢复您的测试目录。

      5 ) 手动运行测试:

      mvn chatunitest:copy 

      运行该命令将复制所有生成的测试代码到您的测试文件夹,同时备份您的测试目录。

       mvn chatunitest:restore 

      运行该命令将恢复您的测试目录。

    第 1 条附言    2023-07-17 16:51:36 +08:00

    原理图之前的链接失效了

    avatar

    4 条回复    2023-07-20 07:56:47 +08:00
    jack778
        1
    jack778  
       2023-07-18 13:23:21 +08:00
    牛逼
    24Arise
        2
    24Arise  
       2023-07-18 20:13:13 +08:00 via iPhone
    先占位

    明天试试
    smark
        3
    smark  
       2023-07-19 00:21:47 +08:00
    关注一波
    coderchenzhi
        4
    coderchenzhi  
    OP
       2023-07-20 07:56:47 +08:00
    @24Arise 欢迎提供反馈、提 issue
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5245 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 52ms UTC 01:34 PVG 09:34 LAX 17:34 JFK 20:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86