基于Python的接口自动化unittest测试框架和ddt数据驱动详解


Posted in Python onJanuary 27, 2021

引言

在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用例时测试数据如何管理和加载。针对测试用例加载以及执行控制,python语言提供了unittest单元测试框架,将测试用例编写在unittest框架下,使用该框架可以单个或者批量加载互不影响的用例执行及更灵活的执行控制,对于更好的进行测试数据的管理和加载,这里我们引入数据驱动的模块:ddt,测试数据和测试脚本的分离,通过ddt数据驱动来加载测试数据到测试用例脚本中,通常在接口自动化测试中会将unittest和ddt结合起来使用,从而实现测试用例脚本和测试数据的载入来完成测试的执行。下面来看看unittest框架和ddt这两个模块具体的应用。

一、unittest测试框架

unittest单元测试框架是python语言的一套标准模块,封装提供了诸多操作测试用例和用例加载、测试前置和场景恢复以及测试结果输出等一系列类和方法。

1.unittest框架中最核心四个组件概念:

(1)TestCase:测试用例类,编写测试用例脚本时需要继承该类,从而具有该类的属性和方法,一个TestCase实例就是一个测试用例,其中测试用例方法都以test开头。

(2)TestSuite:测试集,也就是测试用例的集合,用来组织用例。

(3)testrunner:用来执行测试用例,并返回测试用例的执行结果,可以用图形或者文本将测试结果形象地展现出来,HTMLTestRunner用来生成图形化的报告,TextTestRunner用来生成简单的文本测试结果。

(4)testfixure:测试夹件,主要用于测试用例的前置初始化和执行后的销毁。

2.testcase----测试用例

  • 新建一个的.py测试用例文件必须是test开头,如test_login.py,主要后续用于识别测试用例文件编写测试用例的类,必须继承unittest.TestCase,做为测试类
  • 测试类中用例的方法名称必须以test开头,用于识别测试用例数
  • 测试类中的用例执行顺序,按照以test开头的方法后的Ascill码顺序执行(0~9,A~Z,a~z)

3.testfixure----测试夹件

  • 也叫测试夹具,主要是用例前置的初始化以及执行后的销毁
  • 测试夹件提供两种方法,一种是类级别的:setup()和teardown(),一种是方法级别的:setUpClass()和tearDownClass()
  • 类级别的测试夹件,每一条测试用例执行之前与之后都要运行一次setup()和teardown();方法级别的测试夹件,所有测试用例执行之前到执行完成只运行一次setUpClass()和tearDownClass()

下面通过简单的代码示例看看TestCase与TestFixure的使用

(1)使用setup()和teardown(),创建test_666.py文件编辑如下代码:

import unittest
 
class test_unittest(unittest.TestCase):
 def setUp(self):
  print("测试环境初始化,开始执行setup")
 
 def tearDown(self):
  print("测试执行完成,运行teardown")
  print("------------------------------")
 def test_a(self):
  print("开始执行test_a用例")
 
 def test_A(self):
  print("开始执行test_A用例")
 
 def test_1(self):
  print("开始执行test_1用例")
 
 def notest_1(self):
  print("不执行notest_1用例")
 
if __name__ == "__main__":
 unittest.main()

执行后,输出如下:

基于Python的接口自动化unittest测试框架和ddt数据驱动详解

在代码中我们编写了4个def用例方法,只执行了3个def,因为最后一个def不是test开头。可以看到每执行一个def用例,setup()和teardown()都会执行一次,其中按照执行顺序:test_1最先执行,test_A其后,test_a最后执行

(2)使用setUpClass()和tearDownClass()

对于setUpClass()和tearDownClass()我们只需将上面代码,稍微修改即可

import unittest
 
class test_unittest(unittest.TestCase):
 @classmethod
 def setUpClass(cls):
  print("测试环境初始化,开始执行setup")
 @classmethod
 def tearDownClass(cls):
  print("测试执行完成,运行teardown")
  print("------------------------------")
 def test_a(self):
  print("开始执行test_a用例")
 
 def test_A(self):
  print("开始执行test_A用例")
 
 def test_1(self):
  print("开始执行test_1用例")
 
if __name__ == "__main__":
 unittest.main()

 运行效果如下:

可以看到所有用例都执行完后,setUpClass()和tearDownClass()只运行了一次。因此在编写一个测试脚本时,里面写了多个测试用例,

这时我们希望的是所有用例执行完成后再销毁环境,这时使用setUpClass()tearDownClass()就比较好了。

基于Python的接口自动化unittest测试框架和ddt数据驱动详解

3.TestSuite----测试集

unittest框架下提供了unittest.TestSuite()和unittest.TestLoader()类,这两个类下封装了加载用例的方法,用于加载测试用例到测试集中

(1)unittest.TestSuite()提供单个用例加载方法

addTest():单个用例加载,当然也可以将多个用例的方法名放入列表中添加到addTest()中,加载多条测试用例

(2)unittest.TestLoader()提供批量加载或发现用例的方法

loadTestsFromTestCase(测试类名):添加一个测试类
loadTestsFromModule(模块名):添加一个模块
discover(测试用例的所在目录):指定目录去加载,会自动寻找这个目录下所有符合命名规则的测试用例

4.testrunner----测试运行

testrunner就是用来执行测试用例的,并且可以生成相应的测试报告。测试报告有两种展示形式,一种是text文本,一种是html格式。
​html格式的就是HTMLTestRunner了,HTMLTestRunner是Python标准库的unittest框架的一个扩展,它可以生成一个直观清晰的HTML测试报告。使用的前提就是要下载HTMLTestRunner.py,下载完后放在python的安装目录下的scripts目录下即可。

通过代码示例看看testsuite和testrunner这两个组件的使用,上面的test_666.py用例文件我们已经写好了3条用例了,现在我们来加载这些用例

新建run_case.py文件,该文件和test_666.py文件放置在同一个包文件:test下,run_case.py文件编辑如下代码运行:

import unittest
from test.test_666 import test_unittest
 
# 单个用例加载
suite = unittest.TestSuite()
case1 = test_unittest('test_1')
case2 = test_unittest('test_a')
suite.addTest(case1)
suite.addTest(case2)
print(suite)
print("------------------")
# 批量用例加载
case_path = r"E:\api_test\test"
# 按文件路径加载,注意该文件为包文件即文件下有__init__.py
all_case = unittest.defaultTestLoader.discover(case_path,pattern="test_666*.py",top_level_dir=None)
all_case1 = unittest.defaultTestLoader.loadTestsFromTestCase(test_unittest) # 按类名称加载
print(all_case)
print("------------------")
print(all_case1)

 输出结果如下:

E:\api_test\Scripts\python.exe E:/api_test/test_bak/run_case.py
<unittest.suite.TestSuite tests=[<test.test_666.test_unittest testMethod=test_1>, <test.test_666.test_unittest testMethod=test_a>]>
------------------
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_666.test_unittest testMethod=test_1>, <test_666.test_unittest testMethod=test_A>, <test_666.test_unittest testMethod=test_a>]>]>]>
------------------
<unittest.suite.TestSuite tests=[<test.test_666.test_unittest testMethod=test_1>, <test.test_666.test_unittest testMethod=test_A>, <test.test_666.test_unittest testMethod=test_a>]>
 
Process finished with exit code 0

 通过unittest框架下提供的加载用例的诸多方法,我们就可以单个或者批量加载用例,后续可以将加载的用例集引入到HTMLTestRunner.py模块生成可视化的测试报告

5.assert----测试断言

无论是什么样的测试用例,最后都需要有用例执行后的验证,在接口自动化测试中我们执行完接口用例也需要验证断言用例执行是否满足我们的预期。unittest提供了丰富的断言方法,常见的断言如下表:

基于Python的接口自动化unittest测试框架和ddt数据驱动详解

二、ddt数据驱动

  • @ddt:类的装饰器,继承的是TestCase类
  • @data():@data装饰符可以把参数当成测试数据,参数可以是单个值、列表、元祖、字典这些类型,用于输入测试数据
  • @unpack:分解数据标志,主要是把元祖和列表解析成多个参数
  • @file_data():输入文件,如json或者yaml类型文件

(1)输入简单的参数:单个值、列表、元祖、字典

import unittest
from ddt import data,unpack,ddt
 
@ddt
class myddt(unittest.TestCase):
 
 @data("123")    # 单个值
 def test1(self,testdata1):
  print(testdata1)
  print("------------------")
 
 @data([1,2,3],[4,5,6]) # 列表
 def test2(self,testdata2):
  print(testdata2)
  print("------------------")
"""
 @data((1, 2, 3))   # 元组
 def test2(self, testdata3):
  print(testdata3)
  print("------------------")
 
 @data({'zhangshan':1,'wangwu':2,'lisi':3}) # 字典
 def test2(self, testdata4):
  print(testdata4)
  print("------------------")
"""
if __name__ == '__main__':
  unittest.main()

 (2)使用@unpack对复杂数据结构,如元组、列表数据进行分解

代码示例:

import unittest
from ddt import data,unpack,ddt
 
@ddt
class myddt(unittest.TestCase):
 
 @data([1,2],[3,4]) # 列表
 @unpack
 def test2(self, testdata1,testdata2):
  print("拆解的第一个参数:",testdata1)
  print("拆解的第二个参数:", testdata2)
  print("------------------")
 
if __name__ == '__main__':
  unittest.main()

 运行后输出如下:

基于Python的接口自动化unittest测试框架和ddt数据驱动详解

(3)使用@file_data()输入文件格式测试数据

编辑一个data.json的文件,代码示例:

import unittest
from ddt import file_data,ddt
 
@ddt
class myddt(unittest.TestCase):
 
 @file_data(r"E:\api_test\test\data.json")
 def test1(self, *value):
  print(value)
 
if __name__ == '__main__':
  unittest.main()

 通过ddt和unittest框架的结合就可以实现测试用例脚本编写、测试执行控制以及测试数据的批量加载,从而完成不同接口测试用例的批量执行和覆盖测试不同测试场景。

到此这篇关于基于Python的接口自动化unittest测试框架和ddt数据驱动详解的文章就介绍到这了,更多相关Python的接口自动化ddt数据驱动内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 实现文件的递归拷贝实现代码
Aug 02 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
详解使用 pyenv 管理多个版本 python 环境
Oct 19 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
对python3 sort sorted 函数的应用详解
Jun 27 Python
Numpy的简单用法小结
Aug 28 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
python取均匀不重复的随机数方式
Nov 27 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
Python @property原理解析和用法实例
Feb 11 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 #Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 #Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 #Python
python re.match()用法相关示例
Jan 27 #Python
selenium+python实现基本自动化测试的示例代码
Jan 27 #Python
Python开发.exe小工具的详细步骤
Jan 27 #Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 #Python
You might like
php面向对象全攻略 (七) 继承性
2009/09/30 PHP
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
php中{}大括号是什么意思
2013/12/01 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
python基础教程之匿名函数lambda
2017/01/17 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python 面试中 8 个必考问题
2018/11/16 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
预备党员党校学习自我评价分享
2013/11/12 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
家长会演讲稿
2014/04/26 职场文书
煤矿安全保证书
2015/02/27 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
大学团日活动总结书
2015/05/11 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
2016年情人节广告语
2016/01/28 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android