基于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中为feedparser设置超时时间避免堵塞
Sep 28 Python
使用IronPython把Python脚本集成到.NET程序中的教程
Mar 31 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
python计算两个数的百分比方法
Jun 29 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
在Django的View中使用asyncio的方法
Jul 12 Python
django Admin文档生成器使用详解
Jul 22 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
Python使用sqlite3模块内置数据库
May 07 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 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实现远程下载文件到本地
2015/05/17 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
JS中的多态实例详解
2017/10/15 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
javascript修改浏览器title方法 JS动态修改浏览器标题
2017/11/30 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
Vue3为什么这么快
2020/09/23 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
如何在python中写hive脚本
2019/11/08 Python
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
区三好学生主要事迹
2014/01/30 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android
ipad隐藏软件app图标方法
2022/04/19 数码科技