python单元测试

Posted KIMdamI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python单元测试相关的知识,希望对你有一定的参考价值。

这两天在学习单python的单元测试功能,太懒了不想每次都启动服务再测试功能,而且还得一遍一遍的写不同的情况下的测试输入,无聊又麻烦。整整花了一天时间,写博客记录一下,不然两三天后估计又忘的差不多了…

python的单元测试框架是unittest,这货还真挺厉害的,一人包圆了python和django的所有测试,Flask怎么搞我没弄过,在这里就不瞎说了。关于unittest有四个概念先得先知道下。

test fixture:主要负责测试前的一些准备工作和一些清理操作,比如创建一些临时数据库、目录和启动服务器等。这个过程由系统负责执行,我们只需要写清楚setUp方法就可以了,关于这个方法后面再介绍吧。
test case:这个比较重要,说三遍。每一个单独的测试方法都叫做一个test case,我们给待测的代码A一个input,A返回给我们一个response,我们最后check下response是不是所期望的,就能判断出A写的对不对。这整个测试过程都在test case中执行。unittest提供了一个基类TestCase,我们写的每个测试方法都必须是在一个类中,而这个类必须继承TestCase。
test suite:这个是许多个test case的集合,通过test case可以让多个test case一起执行。这个过程也是系统负责执行的。
test runner:这个负责test case的执行并把结果展示给用户。
先来看一个简单的测试demo。文件文件目录如下:

unittestDemo
├── my_sum.py
└── test_sum.py
1
2
3
my_sum.py中是个list求和函数。

def sum_list(arg):
total = 0
for val in arg:
total += val
return total
1
2
3
4
5
是测试代码。

from unittest import TestCase
from my_sum import sum_list
import unittest

class TestSum(TestCase):
def test_list_int(self):
data = [1, 2, 3]
result = sum_list(data)
self.assertEqual(result, 6)

def test_list_float(self):
    data = [1.0, 2.0, 3.0]
    result = sum_list(data)
    self.assertEqual(result, 5)

if name == ‘main’:
unittest.main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在test_sum.py中:

先是导入要测试的sum_list 函数。
创建一个测试类TestSum并且继承了TestCase
定义了两个测试函数test_list_int()和test_list_float(),每一个测试函数都是一个test case并且函数名必须以test开头。其中:
(1)先定义一个测试输入data。
(2)执行被测函数并且接受返回的结果。
(3)对结果进行check(一般都是采用断言函数),判断被测函数写的是否正确。
note:测试套路就是这三步,只是有简单和复杂的区别而已
执行测试,在unittestDemo目录下执行命令:

python -m unittest test_sum
1
结果如下:
在这里插入图片描述

先啰嗦几句,.py文件叫做module,module中有一个或多个class,每个class中包含method(或者叫function),这样通过module.class.method就能唯一定位到一个方法。上述测试命令定位到了module级别,系统会去搜索test_sum module中所有继承了TestCase的class并且执行class下所有以test开头的方法。简单来说就是一个命令把module中的所有的测试方法全都执行了。

python -m unittest test_sum.TestSum定位到了class,执行这个类下的所有test case
python -m unittest test_sum.TestSum.test_list_float定位到了method,只执行某个test case
具体执行结果这里就不展示了。

接下来解释下图片中的信息:

第一行显示的是所有test case的结果(若还不清楚test case只的是什么,看下上面的容,或者别的资料吧,不解释了)。测试成功用.(小点)表示,测试失败用F表示,由第一行看出,我们执行了两个测试,一个失败,另一个成功。
FAIL显示了失败的测试的详细信息:
(1)测试方法的名字(test_list_float)
(2)当前的test case出错的原因以及位置,很明显是13行的断言出错。
最下面是执行的测试数量、花费的时间和失败的测试数量。
最后再解释下test_sum.py最下面的两行代码:

if name == ‘main’:
unittest.main()
1
2
这是命令行入口,当我们在命令行中以python test_sum.py的方式执行测试脚本的时候,通过调用unittest.main()去寻找test_sum.py所有继承了TestCase的类并执行类中的test case。也就是当用python -m的方式执行测试时,这两行代码是没用的。

以上是关于python单元测试的主要内容,如果未能解决你的问题,请参考以下文章

四则运算单元测试

常用python日期日志获取内容循环的代码片段

单元测试很棒,但是

词频统计单元测试

pytest文档19-doctest测试框架

python单元测试