我用这个 AI 工具生成单元测试,爽的一批!

news/2024/10/30 21:40:16/

本文分享如何使用驭码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文件中
  • 第三步运行测试文件
  • 第四步查看答案

我就遵照四步进行了测试,出现了错误:
在这里插入图片描述

提示 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')}

就是给缺失的字段增加默认值。接着执行测试命令:
在这里插入图片描述

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

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

AI 来帮助生成单元测试文件看来靠谱,驭码CodeRider 【https://dl.gitlab.cn/w84csrf4】可以的!


http://www.ppmy.cn/news/1543193.html

相关文章

220V降12V1A恒流点灯WT5112

220V降12V1A恒流点灯WT5112 芯片特点 高精度恒流输出:WT5112 是一款适用于非隔离降压型恒流 LED 驱动芯片。在 220V 降 12V、1A 恒流点灯应用中,它能够提供高精度的恒流输出。其恒流精度通常可以达到 3% - 5% 左右,这对于 LED 灯的稳定发光非…

SQLAlchemy 连接 dm

参考链接 SQLAlchemy 框架 | 达梦技术文档 如果密码中出现特殊字符,参考SQLAlchemy 链接数据库,密码中含有或者\特殊字符_python sqlalchemy 连接mysql 密码有特殊字符-CSDN博客 问题:ObjectNotExecutableError: Not an executable object: …

clang-tidy 学习笔记1

1.什么是clang-tidy clang-tidy is a clang-based C “linter” tool. Its purpose is to provide an extensible framework for diagnosing and fixing typical programming errors, like style violations, interface misuse, or bugs that can be deduced via static an…

基于C语言实现的TCP客户端

目录 一、TCP客户端的工作流程 二、C语言实现TCP客户端的代码示例 1. 头文件和宏定义 2. 主函数:连接服务器并进行通信 代码详解 三、编译与运行 1. 编译代码 2. 运行客户端 3. 示例输出 在网络编程中,TCP(传输控制协议)…

一道关于Linux hash 解密的CTF杂项题

一道关于Linux hash 解密的CTF杂项题 题目描述: 猜猜我是用什么方法重置了对方的密码?我登入对方系统使用的密码是MyPa???????? flag为密码的md5值。黑客 192.168.80.134 服务器 192.168.80.136题目文件 $ ls -al file.pcap .r--r--r-- staff staff 54 KB Wed O…

w006基于SpringBoot的网上订餐系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

官宣下代GPU存在缺陷,50系显卡或将迎来涨价

如果说 AMD 在 Ryzen 3000 系列还是和 intel 在 CPU 方面棋差一着的话,Ryzen 5000 系列就是打了个漂亮的翻身仗了。 凭借先进的 7nm 工艺制程和全新架构,让后来 intel 急忙推出「14nm」的 11 代酷睿也难以望其项背。 直到 intel 12 代发布的时候&#xf…

HTML入门教程19:HTML ID

一、ID的基本用法 定义ID&#xff1a; 在HTML元素中&#xff0c;通过在元素的开始标签内添加id属性来定义ID。ID属性的值在整个HTML文档中必须是唯一的&#xff0c;不能重复。例如&#xff1a;<p id"uniqueparagraph">这是一个带有唯一标识符的段落。</p>…