V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
coderchenzhi
V2EX  ›  分享创造

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

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

    简介:

    相信很多人试过用 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   ·   实用小工具   ·   5893 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:35 · PVG 11:35 · LAX 19:35 · JFK 22:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.