基于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的函数嵌套的使用方法
Jan 24 Python
python算法表示概念扫盲教程
Apr 13 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
python实现决策树ID3算法的示例代码
May 30 Python
自学python的建议和周期预算
Jan 30 Python
Python OpenCV实现鼠标画框效果
Aug 19 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
Python基础教程之输入输出和运算符
Jul 26 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 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 生成短网址原理及代码
2014/01/23 PHP
PHP实现数组递归转义的方法
2014/08/28 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
详解babel升级到7.X采坑总结
2019/05/12 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
js制作提示框插件
2020/12/24 Javascript
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
Python中elasticsearch插入和更新数据的实现方法
2018/04/01 Python
python实现数据库跨服务器迁移
2018/04/12 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
Python模块相关知识点小结
2020/03/09 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Python定义一个Actor任务
2020/07/29 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
墨西哥网上超市:Superama
2018/07/10 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
《再见了,亲人》教学反思
2014/02/26 职场文书
《将心比心》教学反思
2014/04/08 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
会员活动策划方案
2014/08/19 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
详解jQuery的核心函数和事件处理
2022/02/18 jQuery