5、自动化测试框架-Unittest
参考:https://www.bilibili.com/video/BV1xJ411v7Eb?p=1
5.1 Unittest简介
Unittest是Python内部自带的一个单元测试的模块,它设计的灵感来源于Junit,具有和Junit类似的结构。Unittest具备完整的测试结构,支持自动化测试的执行,对测试用例集进行组织,并且提供了丰富的断言方法,最后生成测试报告。
5.2 重要概念
在继续学习之前,我们需要掌握四个Unittest的重要概念:
(1) test fixture:翻译过来是测试固定装置的意思。形象的说,把整个测试过程看作大的装置,这个装置里不仅具有测试执行部件,还有测试之前环境准备和测试之后环境清理的部件,有机的结合起来就是一个更大的测试装置,即test fixture。
(2) test case:测试用例,注意与前面的TestCase类不是同一个概念。一个完整的测试流程就是一个测试用例,通过一些特定的输入得到响应,并对响应进行校验的过程。我们通过去继承TestCase这个父类,可以创建新的测试用例。
(3) test suite:测试套件,也称为测试集合。多个测试用例组合在一起就形成了测试集,当然测试集里不仅能包含测试用例,也可以再次嵌套测试集,测试集可以用于代码的组织和运行。
(4) test runner:是Unittest中的重要组成部分,主要职责为执行测试,通过图形、文本或者返回一些特殊值的方式来呈现最终的运行结果。例如执行的用例数、成功和失败的用例数。
5.3 测试框架代码
运行结果:
5.4 执行过程
1)导入unittest模块。
2)定义一个测试类(例如:forTest),必须继承于unittest.TestCase类。
3)可以创建类方法setUpClass,这个类方法在代码中不需调用,执行代码时会首先执行该代码,实现类的初始化功能
4)可以创建类方法tearDownClass,这个类方法在代码中不需调用,执行代码时会最后执行该代码,实现类资源的释放
5)类的代码中可以正常定义和使用:变量和方法
6)可以创建方法setUp,这个类方法在代码中不需调用,该代码会在每条测试用例执行前执行,实现测试用例的初始化功能(前置条件)
7)可以创建方法tearDown,这个类方法在代码中不需调用,该代码会在每条测试用例执行后执行,实现测试用例数据处理和资源释放(后置条件)
8)类中测试用例方法必须以test_xxx来命名,这样unittest才能正确将其识别成测试用例。测试用例不按代码先后顺序执行,按测试用例的方法名排序:0-9->A-Z->a-z。
9)在main函数中只能写入unittest.main(), unittest.main()会自动按顺序执行测试类(继承于unittest.TestCase类)中的代码。
5.5 数据驱动ddt
ddt(data-driven test),数据驱动测试。
1)安装ddt:pip install ddt
2)基本使用:
(1)使用@ddt装饰测试类;
(2)测试类中必须有setUp和tearDown两个方法;
(3)基于实际应用,选择对应的装饰器
3)@data装饰器,传入参数,并使测试用例执行多次,每次传参以“,”为界。
使用列表传递参数
4)@unpack装饰器,可以传入多个参数
@unpack装饰器会将@data装饰器中的元组(或列表)按顺序拿出来,将元组(或列表)解包后,传给测试用例中的形参。
执行结果:
5)通过读取文件,上传参数
5.6 yml文件操作
1)安装
pip install PyYaml
2)导入
import yaml
3)yml文件书写格式
4)@file_data装饰器,用于读取yml文件的装饰器
yml数据文件中的数据以键值对来存储,格式很重要。
5.7 Unittest断言:saaert
TestCase类已经提供了封装好的断言方法进行断言校验。
Case2失败,并打印错误信息。
Unittest常用断言
5.8 跳过:Unittest skip()
当测试用例写完后,有些模块有改动时候,会影响到部分用例的执行,这个时候我们希望暂时跳过这些用例。
或者前面某个功能运行失败了,后面的几个用例是依赖于这个功能的用例,如果第一步就失败了,后面的用例也就没必要去执行了,直接跳过就行,节省用例执行时间。
可以使用skip装饰器,实现用例跳过的功能。
1)skip装饰器一共有四个:
(1)@unittest.skip(reason)
无条件跳过用例,reason是说明原因
(2)@unittest.skipIf(condition, reason)
condition为true的时候跳过
(3)@unittest.skipUnless(condition, reason)
condition为False的时候跳过
(4)@unittest.expectedFailure
如果测试用例失败了,这个用例不计入失败的case数目,按跳过处理,不报错,只反馈错误信息。
如果测试用例成功,会报错。
2)编写代码
如果注释掉用例4前的装饰器,测试结果如下:
5.9 测试套件(Suite)和Runner
测试框架内的测试用例执行时,不按代码前后位置执行,而是按测试用例名称执行。
测试用例执行顺序:0-9->A-Z->a-z
1)测试套件Suite作用:
(1)用于给测试用例排序
(2)多种方式添加测试用例
2)测试套件Suite用法:
(1)addTest():将测试用例加入测试套件。
注意:如果将for_suite模块中的代码复制到skip_001模块的main函数中,并且在skip_001文件中运行,是无法实现测试用例排序的。skip_001运行时,依旧会按照文件名的顺序来运行。
(2)addTests():将列表加入测试测试用例套件
(3)discover():发现指定目录下的多个测试文件(*.py)
(4)TestLoader():载入多个测试用例
(a)TestLoader().loadTestsFromTestCase()
(b)TestLoader().loadTestsFromName()
5.10 测试报告:HtmlTestRunner
1)安装环境
pip install html-testRunner
2)导包
from HtmlTestRunner import HTMLTestRunner
3)使用
测试完成后,会生成测试报告,报告名称
使用浏览器打开测试报告:
5.11 unittest支持cmd命令行运行
1)python -m unittest test1 test2
这里指的是按顺序执行test1.py test2.py文件中的unittest模块。
2)python -m test1.TestStringMethods
这里指的是执行test1.py文件中名为TestStringMethods的unittest类。
3)python -m unittest test1.TestStringMethods.test_split
这里指的是只执行test1.py文件中名为TestStringMethods的unittest类的test_split函数。
4)python -m unittest
这里指的是编译该层目录下继承unittest模块的所有py文件。
5)python -m unittest discover
等同于python -m Unittest,后还要接参数时要加discover。
6)python -m unittest discover -s dest_Dir -p "*.py"
编译目标dir目录下继承unittest模块的所有py文件,其中-s 后接对应文件夹,-p 后接匹配模式。