基于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的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
Numpy掩码式数组详解
Apr 17 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 Python
django创建超级用户过程解析
Sep 18 Python
Python换行与不换行的输出实例
Feb 19 Python
django Model层常用验证器及自定义验证器详解
Jul 15 Python
python实现简单的名片管理系统
Apr 26 Python
Python Pygame实战之塔防游戏的实现
Mar 17 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
一个用于网络的工具函数库
2006/10/09 PHP
FCKeditor的安装(PHP)
2007/01/13 PHP
PHP 得到根目录的 __FILE__ 常量
2008/07/23 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
常用PHP框架功能对照表
2014/10/23 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
浅谈React高阶组件
2018/03/28 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
深入理解Python中的super()方法
2017/11/20 Python
python实现验证码识别功能
2018/06/07 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
大学生职业生涯规划书模板
2014/01/03 职场文书
竞选学委演讲稿
2014/09/13 职场文书
银行业务授权委托书
2014/10/10 职场文书
整改通知书格式
2015/04/22 职场文书
Python Pygame实战之塔防游戏的实现
2022/03/17 Python
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python