我用这个 AI 工具生成单元测试,简直不要太爽!

news/2025/1/18 17:58:34/文章来源:https://www.cnblogs.com/jihugitlab/p/18516032

本文分享如何使用驭码CodeRider 的单元测试功能生成单元测试文件。

在之前的文章如何用 Python 手撸一个 GitLab 代码安全审查工具?中,我用 Python 写了一个接受极狐GitLab 代码安全审计事件流并且将消息推送到钉钉群的脚本,完整的 python 代码为:

    from fastapi import FastAPIimport uvicornimport requestsimport jsonapp = FastAPI()@app.post("/jh-gitlab")async def gitlab_payload(data: dict):# 抓取审计事件中的主要信息audit_event_info = {"Action": data['details']['custom_message'],"Author": data['details']['author_name'],"IP Address": data['details']['ip_address'],"Entity Path": data['details']['entity_path'],"Target Details": data['target_details']}print(audit_event_info)# 发送消息通知notification(audit_event_info)def notification(payload: dict):webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=你的钉钉 webhook token"# 发送消息的内容message = {"msgtype": "text","text": {"content" : "GitLab: {}".format(json.dumps(payload))}}# 发送 POST 请求headers = {'Content-Type': 'application/json'}response = requests.post(webhook_url, data=json.dumps(message), headers=headers)print(response.text)if json.loads(response.text)['errcode'] == 0:print("Send Message Success!")return Trueelse:print("Send Message Failed!")return json.loads(response.text)['errmsg']if __name__ == "__main__":uvicorn.run(app, host="0.0.0.0", port=8000)

对于这段代码写的是否 OK 最好的验证方法就是生成一些单元测试来测试。为了方便,我决定用 AI 工具来帮我生成单元测试代码。

我选择的是极狐GitLab 公司自研发布的 AI 产品驭码CodeRider(当前该产品可以免费试用【https://dl.gitlab.cn/w84csrf4】)。 该产品就有一个单元测试生成功能,当我在 PyCharm 中安装好驭码CodeRier 并直接点击test命令时:

file

就开始了单元测试代码的自动生成:

file

最终生成了如下测试代码:

from fastapi.testclient import TestClient
from unittest.mock import patch
import jsonfrom main import app, notificationclient = TestClient(app)def test_gitlab_payload_success():payload = {"details": {"custom_message": "Project marked for deletion","author_name": "Administrator","ip_address": "36.133.246.166","entity_path": "devsecops/ai-deleted-7"},"target_details": "ai-deleted-7"}with patch('main.notification') as mock_notification:mock_notification.return_value = Trueresponse = client.post("/jh-gitlab", json=payload)assert response.status_code == 200mock_notification.assert_called_once_with({"Action": "Project marked for deletion","Author": "Administrator","IP Address": "36.133.246.166","Entity Path": "devsecops/ai-deleted-7","Target Details": "ai-deleted-7"})def test_gitlab_payload_missing_fields():payload = {"details": {"custom_message": "Project marked for deletion","author_name": "Administrator","ip_address": "36.133.246.166"},"target_details": "ai-deleted-7"}response = client.post("/jh-gitlab", json=payload)assert response.status_code == 422def test_notification_success():payload = {"Action": "Project marked for deletion","Author": "Administrator","IP Address": "36.133.246.166","Entity Path": "devsecops/ai-deleted-7","Target Details": "ai-deleted-7"}with patch('requests.post') as mock_post:mock_response = mock_post.return_valuemock_response.text = json.dumps({"errcode": 0, "errmsg": "ok"})result = notification(payload)assert result == Truemock_post.assert_called_once()def test_notification_failure():payload = {"Action": "Project marked for deletion","Author": "Administrator","IP Address": "36.133.246.166","Entity Path": "devsecops/ai-deleted-7","Target Details": "ai-deleted-7"}with patch('requests.post') as mock_post:mock_response = mock_post.return_valuemock_response.text = json.dumps({"errcode": 400, "errmsg": "Bad Request"})result = notification(payload)assert result == "Bad Request"mock_post.assert_called_once()

看到这些代码,我就想知道怎么测试呢。然后就问驭码CodeRider,如果要运行这些单元测试,我该怎么操作?

file

驭码CodeRider 给的答案是四步:

  • 第一步安装依赖
  • 第二步将测试代码存放在 test_main.py文件中
  • 第三步运行测试文件
  • 第四步查看答案

我就遵照四步进行了测试,出现了错误:

file

提示 FAILED pytest_main.py::test_gitlab_payload_missing_entity_path - KeyError: 'entity_path'。仔细看了一下,测试代码中有一个检测缺失字段的环节,我代码中的 payload 有五个参数:ActionAuthorIP AddressEntity Path以及 Target Details

下面代码

def test_gitlab_payload_missing_fields():payload = {"details": {"custom_message": "Project marked for deletion","author_name": "Administrator","ip_address": "36.133.246.166"},"target_details": "ai-deleted-7"}response = client.post("/jh-gitlab", json=payload)assert response.status_code == 422

用来测试在缺失 entity_path字段的情况。比较遗憾的是,我在源代码中并没有对 payload 中的字段进行校验处理。所以我把这个错误发给了驭码CodeRider:

file

驭码CodeRider 给出了两种解决方案:

  • 方案一:在测试中添加 entity_path 字段
  • 方案二:修改 gitlab_payload 函数以处理缺失字段

按照这两种方式都可以,我选择了修改 gitlab_payload相关代码,于是继续问了驭码CodeRider:

file

驭码给的修改代码为:

    audit_event_info = {"Action": data['details'].get('custom_message', 'Unknown Action'),"Author": data['details'].get('author_name', 'Unknown Author'),"IP Address": data['details'].get('ip_address', 'Unknown IP'),"Entity Path": data['details'].get('entity_path', 'Unknown Path'),"Target Details": data.get('target_details', 'Unknown Target')}

就是给缺失的字段增加默认值。接着执行测试命令:

file

可以看到 4 条测试全部通过。

当然,上面的整个流程仅仅为测试使用,生成的单元测试不一定是最准确、最后直接可以使用的,但是我们可以看到用 AI 来生成单元测试文件至少是靠谱的、能够减轻不少工作量,先用 AI 生成,然后做一些修改,这样工作能轻松不少。

用 AI 来帮助生成单元测试文件看来靠谱,驭码CodeRider 可以的!

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible原理和安装

一.概念 简介 Ansible是一个IT自动化工具。它能配置系统、部署软件、编排更复杂的IT任务,如连续部署或零停机时间滚动更新。连接其他主机(管理节点)默认使用ssh协议 特性 Agentless:不需要在被管理节点上安装客户端,只要有sshd即可Serverless:在服务端不需要启动任何服务,…

明火识别视频分析服务器区域入侵智慧园区安防视频监控及动态布控预警方案

智慧园区安防视频监控及动态布控预警方案是一种综合性的安全管理解决方案,它通过结合视频监控技术、人工智能算法、大数据分析等技术,实现视频分析服务器对工厂区域内人、车、物的全面监控和管理。一、需求和目标系统建设目标:搭建重点部位人脸识别动态布控系统平台,建立动…

四、常用寄存器

DS:内存段地址寄存器 段地址、偏移地址与物理地址内存中数据的地址由段地址和偏移地址组成,其中段地址乘以16再加上偏移地址就是真实的物理地址。对于16进制的数来说,乘以十六就是整体向左移一位,例如:0xFE * 16 = 0xFE0物理地址可以由多种段地址+偏移地址组合而成例如物理…

HTTPS 加密方式

1. HTTP 和 HTTPSHTTP是明文传输,敏感信息容易被中间劫持。 HTTPS = HTTP + 加密,即使传输的数据被劫持了也无法解密。 2. 加密方式:对称加密,非对称加密 对称加密 用同一个key加密解密。 非对称加密 一对key(公钥私钥),公钥加密,私钥解密(or反过来)。 具体实现: 1.…

基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)BO优化前 BO优化过程 BO优化后 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)MBsize = 32; Lr = 0.1; % CNN LSTM构建卷积神经网络 layers = func_model(Nclass,…

WD MYbook存储硬盘数据恢复

WD MYBOOK存储硬盘数据恢复是一个相对复杂但可行的过程,以下是一些建议的恢复方法: 一、硬件检查与恢复 检查连接线: 重新插拔连接线,确保连接稳固且没有损坏。 如果连接线有问题,尝试更换一条新的连接线。 2.更换电脑设备: 如果在一个电脑上无法识别移动硬盘,可以尝试将…

【算法】前缀树

前缀树(Trie 树) 基本内容以树的方式存储字符串的数据结构,方便字符串的查找及判断是否为某一字符串的前缀入门例子 PHONELST - Phone List - 洛谷 | 计算机科学教育新生态题目要求:判断一组字符串中是否存在某一字符串是另一字符串的前缀。例如在{“911”, “91140”,“…

Python工具箱系列(五十七)

图像分割与人脸识别 众所周知图像是由若干有意义的像素组成的,图像分割作为计算机视觉的基础,对具有现有目标和较精确边界的图像进行分割,实现在图像像素级别上的分类任务。图像分割可分为语义分割和实例分割两类,区别如下: 语义分割:将图像中每个像素赋予一个类别标签,…

Nuxt.js 应用中的 imports:dirs 事件钩子详解

title: Nuxt.js 应用中的 imports:dirs 事件钩子详解 date: 2024/10/30 updated: 2024/10/30 author: cmdragon excerpt: imports:dirs 是 Nuxt.js 中的一个生命周期钩子,用于扩展导入目录。通过这个钩子,开发者可以灵活地添加、修改或删除项目中的导入目录,从而提高模块…

OSI模型

Java 复习笔记 OSI模型 开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI) 1-7 物联网叔会使用 (资源子网) 应用层为应用程序提供交互服务 。域名系统DNS文件传输FTP支持万维网(www)应用的HTTP协议,支持电子邮件的SMTP协议 表…

12 编程基础:语句与函数

编程有自己的语法, if,then,end if while循环 for循环 将语言打包成函数, 有专门的函数库公开使用,还有声音、图像库