10分钟 举例子Python 单元测试实践 入门教程
作者:知乎 Ai酱
首发于:知乎专栏《适合初学者的机器学习神经网络理论到实践》,转载需注明出处
华南理工大学 计算机技术硕士在读
2 人赞同了该文章
为何要测试:设定预期结果让计算机判断结果是否符合预期。省得组件很多的时候一个一个的检测这些组件是否运行结果正确。
- 如何比较运行时某变量大小或类型是否与预期值一致: assert(断言)
assert的语法是这样(如果条件不成立则报错,成立则不报错):
assert 条件语句
或许你会问条件不成立报错了,然后呢?。Good Question。
答:这个条件语句是用来判断结果是否在我们预期范围呢。条件不成立证明运行的结果是错误的。大家一般非常讨厌报错,但是它报错了有什么好处呢?报错信息会提示哪句报错了在哪行。这就节省了我们找错误在哪的时间。
assert例子:
定义一个最简单的assert测试代码
x = 1
assert x < 0
输出,提示第二行报错,我们预期x是负数但是程序运行结果的x是非负所以报错。这提示我们看看产生x的那段代码是否有问题:
Traceback (most recent call last):
File "<ipython-input-4-8363583f3b92>", line 2, in <module>
assert x < 0
AssertionError
assert练习:
问题描述:小明写了个函数求一个数组的平均数给别人调用。但是不确定别人传进来是否是一个数组,如果不是数组就得报错提示用户。(平常我们用别人写的包报错提示类型不正确就是这么做的)。
参考代码:
def mean(num_list):
'''
求平均数
num_list: 数字组成的列表
'''
assert isinstance(num_list,list) # 检查传进来的参数是列表,不是就报错
return sum(num_list)/len(num_list)
# mean(1) #传递错误类型参数进去会报错,你取消注释看看会怎么报错
mean([1,2,3]) # 参数类型正确,不报错
你可以调用这个函数看看如果传递进去不是数组而是一个数看会怎么报错。多主动试错才能看到报错信息知道怎么改。
- Python单元测试实践
我们写了一个求平均数的函数mean(),那怎么验证它是否正确呢?这就是单元测试。每次只测试一个函数是否正确。而不是测试整个包运行是否正确。就像测试手机,我首先测试电源能不能导电而不是开机运行测试整机。
这样一个单元一个单元的测试好处是能保证各个单元基本正确,而且可以预先发现哪个单元出现了bug。
怎么写单元测试用例呢?
一个函数就是一个测试用例,这个函数名需要以test_开头 ,因为pytest会自动一次性批量执行前缀名是"test_"的函数。
# -*- coding: utf-8 -*-
def mean(num_list):
'''
求平均数
num_list: 数字组成的列表
'''
assert isinstance(num_list,list) # 检查传进来的参数是列表,不是就报错
return sum(num_list)/len(num_list)
##########下面是单元测试用例,测试求平均数这个函数是否正确##############
def test_mean_ints():
"""测试求预期结果是整数情况下是否正确"""
num_list = [1,2,3,4,5]
result = mean(num_list)
desire = 3
assert result == desire
def test_mean_floats():
"""
测试求预期结果是浮点数情况下是否正确
小提示:这个在Python2下测试是不通过,Python2输出结果是2, Python3下结果是2.5
"""
num_list = [1,2,3,4]
result = mean(num_list)
desire = 2.5
assert result == desire
def test_mean_zero():
"""测试含有0的数组求平均数是否正确"""
num_list = [0,3,4,5]
result = mean(num_list)
desire = 3
assert result == desire
运行测试
pytest -v 文件名.py
pytest原理:pytest会自动执行前缀名是"test_"的函数
下面是运行的结果,你可以修改下代码看测试失败的情况。
- 如何测试近似相等,非常接近我们就认为是相等(需要用到numpy)
在写什么网络的时候输出总是接近标签但是不等于标签,此时用assert就不行了。
比如: 我们的标签是1而神经网络的输出总是0.999999999. "assert 0.99999999 == 1",这个肯定会不成立。但是事实它已经是符合预期了。此时,我们只需要判断它是否接近预期值就可以。
近似相等测试例子:
from numpy.testing import assert_allclose
# rtol设置的是精度,比如1e-4那就是只要两者相差在0.0001内就认为测试通过
assert_allclose(0.999999,1,rtol=1e-4)
如果对你有启发,欢迎给
点赞或关注,你的支持是创作动力