使用ChatGPT给Python代码写单元测试

news2024/11/16 23:50:54

先写一个简单的python函数,找chatgpt写单元测试:

有一个python函数,请帮忙写单元测试,函数长这样:

def test2(a: list, b: list) -> float:
    """
    计算两个坐标的距离
    :param a list 格式如:[x1, y1]
    :param b list 格式如:[x2, y2]
    :return float
    """
    s = math.pow(a[0]-b[0], 2) + math.pow(a[1]-b[1], 2)
    return math.sqrt(s)

过了一会得到回复:

可以编写以下测试用例:

```python
import math

def test_test2():
    # 测试两个坐标点在平面内的情况
    assert math.isclose(test2([0, 0], [3, 4]), 5.0)
    assert math.isclose(test2([5, 5], [1, 1]), 5.656854249492381)
    assert math.isclose(test2([1, 5], [1, 1]), 4.0)

    # 测试两个坐标点在同一位置的情况
    assert math.isclose(test2([1, 1], [1, 1]), 0.0)
    assert math.isclose(test2([0, 0], [0, 0]), 0.0)

    # 测试两个坐标点在不同平面的情况
    assert math.isclose(test2([0, 0], [-3, -4]), 5.0)
    assert math.isclose(test2([5, 10], [1, 1]), 9.848857801796104)
    assert math.isclose(test2([1, 5], [8, 1]), 7.810249675906654)
```

这些测试用例包括了测试两个坐标点在平面内、在同一位置、
在不同平面的情况,可以覆盖到该函数的所有可能情况。

这个结果已经超出我预期了,一个普通的单元测试感觉已经成型了,而且它还理解了“坐标”和“平面”。不过有小问题,注释是不对的,两个点不可能不再同一个平面上。执行这个测试函数,最后一个assert是通不过的。

使用ChatGPT给Python代码写单元测试

尝试让它进行修正:

上面最后一个assert测试不通过

它的回复:

感谢您指出这个问题。我重新检查了代码并发现我的错误。
这是由于我在误将x轴和y轴的坐标值进行了计算,导致最终
结果不正确。以下是已修复的测试用例:

```python
import math

def test_test2():
    # 测试两个坐标点在平面内的情况
    assert math.isclose(test2([0, 0], [3, 4]), 5.0)
    assert math.isclose(test2([5, 5], [1, 1]), 5.656854249492381)
    assert math.isclose(test2([1, 5], [1, 1]), 4.0)

    # 测试两个坐标点在同一位置的情况
    assert math.isclose(test2([1, 1], [1, 1]), 0.0)
    assert math.isclose(test2([0, 0], [0, 0]), 0.0)

    # 测试两个坐标点在不同平面的情况
    assert math.isclose(test2([0, 0], [-3, -4]), 5.0)
    assert math.isclose(test2([5, 10], [1, 1]), 9.219544457292887)
    assert math.isclose(test2([1, 5], [8, 1]), 7.810249675906654)
```

现在,所有测试用例都应该能够通过。

虽然它说修正了,但是实际上是越改越错。

--------------------------------
再放一个实际的函数试试:

有一个python函数,请帮忙写单元测试,函数长这样:
def distance_hy(line1, line2):
    """聚类算法的距离函数,依据行高及纵坐标计算两个文本行的距离
    距离越小越有可能是在同一行上"""
    if line1[0] == line2[0]:
        return 0.0
    h1, y1 = line1[1:]
    h2, y2 = line2[1:]
    diffy = abs(y1 - y2)
    hmin, hmax = min(h1, h2), max(h1, h2)
    if hmax > hmin * 2 or diffy > hmin / 2:
        return 1000.0
    return (hmax - hmin) / hmin + diffy / hmin

回复:

好的,下面是一个基本的测试用例:

```python
def test_distance_hy():
    line1 = (1, 10, 20)
    line2 = (2, 10, 25)
    assert distance_hy(line1, line2) == 0.25
    
    line1 = (1, 10, 20)
    line2 = (2, 11, 25)
    assert distance_hy(line1, line2) == 1000.0
    
    line1 = (1, 10, 20)
    line2 = (2, 5, 22)
    assert distance_hy(line1, line2) == 1.0
    
    line1 = (1, 10, 20)
    line2 = (2, 30, 22)
    assert distance_hy(line1, line2) == 1000.0
```

这个测试用例覆盖了 distance_hy() 函数的各个分支,
包括相同行号的情况、行高和纵坐标的差异是否满足距离
计算的条件以及行高和纵坐标的比较(除数不能为0)等。

这个测试是通不过的,不过基本代码有了,也能考虑边界值,让它再提升提升:

这个覆盖率还不够,请提高一下覆盖率

得到的结果:

好的,下面是增加覆盖率后的测试用例:

```python
def test_distance_hy():
    # 相同行号
    line1 = (1, 10, 20)
    line2 = (1, 11, 25)
    assert distance_hy(line1, line2) == 0.0
    
    # 行高和纵坐标满足距离计算条件
    line1 = (1, 10, 20)
    line2 = (2, 11, 25)
    assert distance_hy(line1, line2) == 1000.0
    
    # 行高和纵坐标不满足距离计算条件
    line1 = (1, 10, 20)
    line2 = (2, 5, 22)
    assert distance_hy(line1, line2) == 1.0
    
    # 行高和纵坐标相差太大,不满足距离计算条件
    line1 = (1, 10, 20)
    line2 = (2, 30, 22)
    assert distance_hy(line1, line2) == 1000.0
    
    # 行高和纵坐标相同,距离为0
    line1 = (1, 10, 20)
    line2 = (2, 10, 20)
    assert distance_hy(line1, line2) == 0.0
    
    # 行高相同,纵坐标差距过大,不满足距离计算条件
    line1 = (1, 10, 20)
    line2 = (2, 100, 22)
    assert distance_hy(line1, line2) == 1000.0
    
    # 行高不同,纵坐标相同,距离为行高比
    line1 = (1, 10, 20)
    line2 = (2, 20, 20)
    assert distance_hy(line1, line2) == 1.0
    
    # 行高不同,纵坐标差距不大,距离为行高比加上纵坐标差比
    line1 = (1, 10, 20)
    line2 = (2, 12, 22)
    assert distance_hy(line1, line2) == 1.2
    
    # 行高比为0的情况,距离为0
    line1 = (0, 10, 20)
    line2 = (0, 10, 25)
    assert distance_hy(line1, line2) == 0.0
    
    # 行高比为无穷大的情况,距离为1000
    line1 = (1, 10, 20)
    line2 = (1000, 10, 25)
    assert distance_hy(line1, line2) == 1000.0
```

这个测试用例对函数的各种情况都进行了覆盖,包括行高
和纵坐标相同,行高和纵坐标不同,行高比为0或无穷大等情况。

我没说,参数的第一个值是行号,它居然能“理解”了。

结论

写代码的能力有点超出预期,感觉程序猿们真的要好好考虑怎么和AI进行协同工作了:

AI可以快速地写出大量的代码,人再对其进行微调,以后程序员最重要的能力可能是:能把复杂事务进行模块化的能力。

在快速进化的AI面前,人要找到自己的定位,不要以为AI没有思想,它自己都理解不了自己说的话,就觉得我们人类有优越感。实际上,AI有没有思想不重要,能不能理解文本也不重要,重要的是它能为我们干活,能大大提升我们的工作效率。

回到三体的那句名言:弱小和无知不是生存的障碍,傲慢才是!

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

自动化测试视频教程、学习笔记领取传送门!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次蓝屏日志

记一次Win 蓝屏日志: 📲引: 虽然说,我是一个在职两年半的程序员,但是对于这个问题其实也和大部分人一样,一脸懵逼🤖 那是一个风和日丽的早上,w开开心心去上班摸鱼🐟&a…

LiteOS qemu realview-pbx-a9 环境搭建与运行

前言 最近打算移植搭建 一些常见的 RTOS 的 qemu 开发学习环境,当前 RT-Thread、FreeRTOS 已经成功运行 qemu,LiteOS 初步验证可以正常 运行 qemu realview-pbx-a9,这里做个记录 首先学习或者研究 RTOS,只是看内核源码&#xff0…

SNN论文总结

Is SNN a great work ? Is SNN a convolutional work ? ANN的量化在SNN中是怎么体现的,和threshold有关系吗,threshold可训练和这个有关吗(应该无关) 解决过发放不发放的问题。 Intuation SNN编码方式 Image to spike patter…

性能优化维度

CPU 首先检查 cpu,cpu 使用率要提升而不是降低。其次CPU 空闲并不一定是没事做,也有可能是锁或者外部资源瓶颈。常用top、vmstat命令查看信息。 vmstat 命令: top: 命令 IO iostat 命令: Memory free 命令: 温馨提示&#xff1a…

Qt应用开发(基础篇)——日历 QCalendarWidget

一、前言 QCalendarWidget类继承于QWidget,是Qt设计用来让用户更直观的选择日期的窗口部件。 时间微调输入框 QCalendarWidget根据年份和月份初始化,程序员也通过提供公共函数去改变他们,默认日期为当前的系统时间,用户通过鼠标和…

《C语言编程环境搭建》工欲善其事 必先利其器

C语言编译器 GCC 系列 GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,常被认为是跨平台编译器的事实标准。原名是:GNU C语言编译器(GNU C Compiler)。 MinGW 又称mingw32 &#xff0c…

C语言练习5(巩固提升)

C语言练习5 选择题 选择题 1&#xff0c;下面代码的结果是&#xff1a;( ) #include <stdio.h> #include <string.h> int main() {char arr[] { b, i, t };printf("%d\n", strlen(arr));return 0; }A.3 B.4 C.随机值 D.5 &#x1f4af;答案解析&#…

Unittest 笔记:unittest拓展生成HTM报告

HTMLTestRunner 是一个unitest拓展可以生成HTML 报告 下载地址&#xff1a;GitHub: https://github.com/defnnig/HTMLTestRunner HTMLTestRunner是一个独立的py文件&#xff0c;可以放在Lib 作为第三方模块使用或者作为项目的一部分。 方式1&#xff1a; 验证是否安装成功&…

Navicat下载安装使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

基于oracle数据库存储过程的创建及调用

基于oracle数据库存储过程的创建及调用 教学大纲&#xff1a; PLSQL编程&#xff1a;Hello World、程序结构、变量、流程控制、游标.存储过程&#xff1a;概念、无参存储、有参存储&#xff08;输入、输出&#xff09;.JAVA调用存储存储过程. 1. PLSQL编程 1.1. 概念和目的…

力扣真题:无重复字符的最长子串(三种方法)

这道题我一开始使用了Set加类似滑动窗口的方法&#xff0c;最后解得出来&#xff0c;但效率不尽人意&#xff0c;最后经过几次修改&#xff0c;最终用到是滑动窗口指针数组的方式讲效果达到最优&#xff0c;超过近99%的代码。 1、第一版 class Solution {public int lengthOf…

python 双向链表

双向链表基本介绍 双向链表增删改查操作思路分析 双向链表增删改查操作代码实现 """ 双向链表的增删改查 """# 英雄类 class HeroNode:next None # 指向下一个节点&#xff0c;默认为空pre None # 指向前一个节点&#xff0c;默认为空def …

STM32 CubeMX (H750)RGB屏幕 LTDC

STM32 CubeMX STM32 RGB888 LTDC STM32 CubeMX一、STM32 CubeMX 设置时钟树LTDC使能设置屏幕参数修改RGB888的GPIO 二、代码部分效果 RGB屏幕线束定义&#xff1a; 一、STM32 CubeMX 设置 时钟树 这里设置的时钟&#xff0c;关于刷新速度 举例子&#xff1a;LCD_CLK24MHz 时…

福利之舞:员工的心跳与企业的平衡术

引言&#xff1a;员工福利与满意度的关系 在现代企业中&#xff0c;员工福利已经不仅仅是一种待遇&#xff0c;而是与员工满意度、忠诚度和生产力紧密相连的关键因素。一个合理且吸引人的福利制度可以大大提高员工的工作积极性&#xff0c;同时也能够吸引和留住顶尖的人才。但…

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

【MySQL系列】Select语句单表查询详解入门(SELECT,AS,模糊查询,运算符,逻辑运算符)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【80天学习完《深入理解计算机系统》】第十一天 3.5 过程(函数调用)

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

【JAVA】String 类

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; String 1. 字符串构造2. String对象的比…

快速封禁大法--东方日报JS解密过程

破解难点&#xff1a; 1.所有接口参数都有时间限制&#xff0c;且与当前加载页面绑定&#xff0c;参数无法在短期内复用 2. token参数破解&#xff1a;点击翻页时第一个加载的接口&#xff0c;会返回一个token&#xff08;详见&#xff1a;get_token() 函数内容&#xff09; 3.…

lab8 lock

PreRead 第六章3.5节&#xff1a;物理内存分配器8.1-8.3 文章目录 PreReadMemory allocatortaskshints思路 Buffer cachetaskhints思路实现 这次的lab&#xff0c;本质上都是通过将锁的粒度减小来获得性能的提升 第一个task&#xff0c;可以简单地按cpu划分&#xff0c;因为本…