在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
上面这段内容摘自维基百科。笔者在入职的时候,一直搞不明白什么是单元测试。即使搜了很多资料,也还是搞不明白。一直到接触代码的时候,才对单元测试有了一个大概的认识。当然以前也一直有一个误解,觉得单元测试是开发做的,跟测试同学扯不上关系,直到真正从事自动化工作时,才知道原来单元测试不管是开发还是测试同学都可以做。
可能到这里一些读者还是不明白什么是单元测试,我将用自己的理解来解释一下什么是单元测试。同时下面也会给出例子让大家更深入了解什么是单元测试。之前我们讲Python基础的时候,讲到如何定义一个函数。比如我们现在有一个加法函数,需要我们输入两个值,那么我们怎么保证我们写的函数是没有问题的呢?是不是要调用这个函数,然后传入两个值,查看返回值是否正确?其实这就是在做单元测试。当然我们没有用规范的做法去做单元测试,那么什么是规范的方法呢?下面我将会以代码形式举例进行介绍。还是用加法函数来进行举例。如下面代码所示:
def add(a, b):
return a + b
print(add(1, 3))
我们已经定义一个add函数,现在调用add函数,传入1和3,然后把返回值进行打印,通过打印我们发现打印的结果为4,可以初步这个函数是没问题的,但是我们知道一组数据不能证明这个函数是没错的,所以我们需要多验证几次,这个时候我们又加入了一行测试代码,如下面代码所示:
def add(a, b):
return a + b
print(add(1, 3))
print(add('a', 3))
运行之后我们发现我们的程序报错了,报错内容如下:
Traceback (most recent call last):
File "F:/blogApiTest/test2.py", line 6, in <module>
print(add('a', 3))
File "F:/blogApiTest/test2.py", line 2, in add
return a + b
TypeError: must be str, not int
原来字符串和数字不能相加!当然我们大家都知道在Python程序里字符串和整型不能相加,但是我们就是要传入字符串和整型进行相加,结果程序奔溃了。所以我们可以说这个add函数是有bug的,那么我们来修复一下上面代码,如下面代码所示:
def add(a, b):
if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
return a + b
else:
return "请输入数字"
print(add(1, 3))
print(add('a', 3))
通过测试后我们发现程序已经被我们修复,但是这里我们思考一下,我们在编写测试用例的时候都要写一个预期结果,但是代码中并没有写预期结果,预期结果在我们的脑海里,我们根据打印出来的实际结果跟我们脑海中预期结果进行比对,如果一致说明程序是没问题的,如果不一致,程序是有问题的。想想看,其实挺麻烦的,那么我们有没有办法在代码中写上预期结果和实际结果呢?答案是肯定的,有!使用assert断言!
加入assert断言
assert一般格式是assert condition , 如果condition为false,那么raise一个AssertionError出来。比如我们断言1和2是否相等,可以写成 assert 1==2 。知道这个逻辑我们就可以给我们的add函数加上断言,如下代码所示:
def add(a, b):
if type(a) == int and type(b) == int:
return a + b
else:
return "请输入数字"
assert add(1, 2) == 3
assert add(1, 3) == 3
运行之后我们会发现程序报出异常,如下代码所示:
Traceback (most recent call last):
File "F:/blogApiTest/test2.py", line 9, in <module>
assert add(1, 3) == 3
AssertionError
通过上面异常我们发现,如果预期结果和实际结果不一致时,assert断言只抛出 AssertionError,这样我们很难搞清断言为什么失败,对于我们排查错误时也造成不必要的时间浪费。那么有没有别的方法可以很快知道为什么会断言失败呢?答案是有的,使用Python Unittest单元的测试框架。
欢迎关注微信公众号:软件测试汪。软件测试交流群:809111560
网友评论