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

先写一个简单的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是通不过的。

尝试让它进行修正:

复制代码
上面最后一个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有没有思想不重要,能不能理解文本也不重要,重要的是它能为我们干活,能大大提升我们的工作效率。

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

实战案例

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

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

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

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

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

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

相关推荐
Tttian6221 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
蹦蹦跳跳真可爱5891 小时前
Python----机器学习(KNN:使用数学方法实现KNN)
人工智能·python·机器学习
独好紫罗兰2 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
闪电麦坤953 小时前
C#:base 关键字
开发语言·c#
Mason Lin3 小时前
2025年3月29日(matlab -ss -lti)
开发语言·matlab
DREAM.ZL3 小时前
基于python的电影数据分析及可视化系统
开发语言·python·数据分析
難釋懷3 小时前
JavaScript基础-移动端常见特效
开发语言·前端·javascript
海姐软件测试4 小时前
Postman参数化设置如何设置?
开发语言·jmeter
松树戈4 小时前
Java常用异步方式总结
java·开发语言
weisian1514 小时前
Java常用工具算法-3--加密算法2--非对称加密算法(RSA常用,ECC,DSA)
java·开发语言·算法