首页 > 其他分享 >我用这个 AI 工具生成单元测试,简直不要太爽!

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

时间:2024-10-30 16:09:16浏览次数:1  
标签:太爽 AI 单元测试 response details post payload mock

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

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

    from fastapi import FastAPI
    import uvicorn
    import requests
    import json

    app = 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 True
        else:
            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 json

from main import app, notification

client = 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 = True
        response = client.post("/jh-gitlab", json=payload)
        assert response.status_code == 200
        mock_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 == 422

def 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_value
        mock_response.text = json.dumps({"errcode": 0, "errmsg": "ok"})
        result = notification(payload)
        assert result == True
        mock_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_value
        mock_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 发布

标签:太爽,AI,单元测试,response,details,post,payload,mock
From: https://www.cnblogs.com/jihugitlab/p/18516032

相关文章

  • AI智能分析视频分析网关算法定制AI赋能视频监控技术的进化之路
    随着人工智能(AI)技术的快速进步,其在众多领域的应用日益广泛,特别是在视频监控行业中表现出了强大的潜力和显著的价值。AI视频监控技术不仅增强了监控系统的智能化程度,还显著提高了安全管理的效率与精确度。本文将详细讨论AI智能分析视频分析网关的关键技术和在各个领域的应用情况。......
  • QwaitCondition.的工作原理
    背景:之前只知道个QWaitCondition用于同步不同的线程运行状态。但不知道为何这样做。为什么还要在QWaitcondition.wai()中还要传入一个QMutext变量的指针。QWaitCondition.wait的工作原理:QWaitCondition.wait的工作原理:伪代码Qmutexmutex;QwaitConditioncon......
  • 【AIGC】AI文本转语音+语音转文本,构建专属领域转文本模型
    AI文本转语音+语音转文本1.引言2.实例2.1文本转语音2.2文字合成语音2.3语音转文字2.4使用热词库2.5完整代码3.总结1.引言在AI领域,文本转语音和语音转文本技术已经取得了显著的进展。这些技术在许多领域都有广泛的应用,如语音助手、实时弹幕、通话检测等。本文我们使......
  • 免费可离线的AI抠图工具(鲜艺AI抠图 )免费下载
    鲜艺AI抠图是一款使用Tauri2和RMBG-1.4开发并免费提供的AI抠图工具,它能够快速去除图片背景,并支持本地和在线图片处理。:极速AI抠图:基于最新的AI技术,能够精准识别图像中的前景和背景,实现快速抠图,处理时间以毫秒计。完全免费:鲜艺AI抠图承诺永久免费,用户无需支付任何费用......
  • AI产品经理成长指南:成为优秀AI产品经理10条
    引言在人工智能(AI)迅猛发展的今天,AI产品经理作为连接技术与市场的桥梁,扮演着至关重要的角色。他们不仅需要深入理解技术,还要精通市场动态,把握用户需求。本文旨在为AI产品经理提供一个全面的成长路径,涵盖必备的知识、技能和实践经验。AI和机器学习基础AI产品经理应具备扎......
  • 程序员必看!AI如何助你工作开挂!
    现如今,国内的AI工具是越来越多了,它们正以惊人的速度发展壮大,它们不仅改变了我们的工作方式和生活方式,还为我们带来了更加便捷、高效、智能的未来生活体验。程序员作为科技的筑梦师,正站在时代的风口浪尖上,如果AI能有效地更快地解决大问题,那它将在未来有无限可能。那AI怎么来......
  • 前端JavaScript的异步编程:从回调到Promise再到Async/Await
    写在前面在前端开发中,异步编程是一个非常重要的概念。随着JavaScript语言和前端技术的发展,异步编程的模式也在不断演进。本文将带你了解从最初的回调函数(Callback)到Promise,再到现代的Async/Await,这些异步编程模式的演变过程。回调函数(Callback)回调函数是最早期的异步编程......
  • 通义灵码:体验AI编程新技能-@workspace 和 @terminal为你的编程插上一双翅膀
    1.前言我是一位运维工程师,用通义灵码个人版的@workspace和@terminal的能力做快速了解一个工程、查找工程内的实现逻辑,以及执行指令不知道如何写,或者不清楚某个指令的意思,对比之前没有灵码,现在提效了20%,再也不需要“百度一下”或者“谷歌”了,使用的具体流程如下:想象一下,开发同......
  • 人形机器人是未来?6只手臂加AI模型,异形机器人重塑种植业。
    图源:reddituserIlustriousTea近日,一则视频在媒体上引起了人们的讨论。国外一处苹果园里,机械嗡鸣声中,六只机械手熟练且快速地采摘成熟的苹果。这是2018年于美国加利福尼亚州成立的前沿农业公司(AdvancedFarmTechnologies)提供的苹果采摘机器人。6条机械臂以每小时2500颗的......
  • MAnimal Controller文档——Main
    MAnimalController动物脚本负责控制动物的所有运动逻辑。它管理所有的Animator和RigidBody参数,以及动物可以执行的所有States和Modes。MainPrinciplesAnimalController(AC)是一个动画框架控制器,支持根运动或就地动画,适用于任何生物或人形角色。它使用Rigidbody与物理世界......