基于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中将字典转换成其json字符串
Jul 16 Python
Python的Django框架中模板碎片缓存简介
Jul 24 Python
python图片验证码生成代码
Jul 02 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
TensorFlow神经网络优化策略学习
Mar 09 Python
Python中return self的用法详解
Jul 27 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
Oct 17 Python
django解决跨域请求的问题
Nov 11 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
执行Python程序时模块报错问题
Mar 26 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
python中append函数用法讲解
Dec 11 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学习教程之第2天
2008/06/15 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript options属性集合操作代码
2009/12/28 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
Vue 实现拨打电话操作
2020/11/16 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
详解Python发送邮件实例
2016/01/10 Python
python交互式图形编程实例(二)
2017/11/17 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
基于python实现百度翻译功能
2019/05/09 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
如何获取Python简单for循环索引
2019/11/21 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
网络安全类面试题
2015/08/01 面试题
家具促销活动方案
2014/02/16 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
Python自动化之批量处理工作簿和工作表
2021/06/03 Python