python单元测试(一) 一时失言乱红尘 2022-02-19 15:55 260阅读 0赞 > 这两天在学习单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 my\_sum.py中是个list求和函数。 def sum_list(arg): total = 0 for val in arg: total += val return total 是测试代码。 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() 在test\_sum.py中: 1. 先是导入要测试的`sum_list` 函数。 2. 创建一个测试类`TestSum`并且继承了`TestCase` 3. 定义了两个测试函数`test_list_int()`和`test_list_float()`,每一个测试函数都是一个`test case`并且**函数名必须以test开头**。其中: (1)先定义一个测试输入`data`。 (2)执行被测函数并且接受返回的结果。 (3)对结果进行check(一般都是采用断言函数),判断被测函数写的是否正确。 **note:测试套路就是这三步,只是有简单和复杂的区别而已** 执行测试,在`unittestDemo`目录下执行命令: python -m unittest test_sum 结果如下: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l5X2RpZWdv_size_16_color_FFFFFF_t_70] > 先啰嗦几句,.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` > 具体执行结果这里就不展示了。 接下来解释下图片中的信息: 1. 第一行显示的是所有`test case`的结果(若还不清楚test case只的是什么,看下上面的容,或者别的资料吧,不解释了)。测试成功用`.`(小点)表示,测试失败用`F`表示,由第一行看出,我们执行了两个测试,一个失败,另一个成功。 2. `FAIL`显示了失败的测试的详细信息: (1)测试方法的名字(test\_list\_float) (2)当前的`test case`出错的原因以及位置,很明显是13行的断言出错。 3. 最下面是执行的测试数量、花费的时间和失败的测试数量。 最后再解释下test\_sum.py最下面的两行代码: if __name__ == '__main__': unittest.main() 这是命令行入口,当我们在命令行中以`python test_sum.py`的方式执行测试脚本的时候,通过调用`unittest.main()`去寻找`test_sum.py`所有继承了`TestCase`的类并执行类中的`test case`。也就是当用`python -m`的方式执行测试时,这两行代码是没用的。 > 先写到这里吧,剩下的以后再补。写博客好花时间啊,也许这也是积累的一种方式。骑着蜗牛继续向前跑~ [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l5X2RpZWdv_size_16_color_FFFFFF_t_70]: /images/20220219/d512e5f177f24fc19a7379bd0f14c3e2.png
还没有评论,来说两句吧...