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

2023-10-26

这篇文章主要介绍了基于Python的接口自动化unittest测试框架和ddt数据驱动详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

目录

引言

一、unittest测试框架

二、ddt数据驱动

软件测试面试小程序

引言

在编写接口自动化用例时,我们一般针对一个接口建立一个.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文件编辑如下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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()

执行后,输出如下:

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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()就比较好了。

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文件编辑如下代码运行:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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提供了丰富的断言方法,常见的断言如下表:

二、ddt数据驱动

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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对复杂数据结构,如元组、列表数据进行分解

代码示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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()

 运行后输出如下:

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

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

1

2

3

4

5

6

7

8

9

10

11

12

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数据驱动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持小编!

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

资料获取方式 :

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用 Flask-restful RequestParser 进行嵌套验证

    使用烧瓶宁静 http flask restful readthedocs org 微框架 我在构建一个RequestParser这将验证嵌套资源 假设预期的 JSON 资源格式为 a list obj1 1 obj2 2 obj3 3 o
  • 为什么 urllib2 出现 urllib2.HTTPError 而 urllib 没有错误?

    我有以下简单的代码 import urllib2 import sys sys path append BeautifulSoup BeautifulSoup 3 1 0 1 from BeautifulSoup import page h
  • Python lambda 函数没有在 for 循环中正确调用[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的 Tkinter 制作一个计算器 我使用 for 循环来绘制按钮 并且尝试使用 lambda 函数 以便仅在按下按钮时调用按钮的操作 而不是在程序启动时立即调用 然而 当我尝试这
  • 缺少 python 配置

    我正在安装一个程序 需要安装 python config 唯一的问题是我目前没有 python config 而且我似乎不知道如何获取它 经过搜索后 我应该可以通过以下方式安装它 yum install python devel 然而 这样
  • 可视化时间序列时标记特定日期

    我有一个包含几年数据的时间序列 例如 ts pd Series np random randn 1000 index pd date range 1 1 2000 periods 1000 ts ts cumsum ts plot 我还有两
  • 这是我尝试安装 pip3 时得到的结果

    这是我尝试安装 pip3 时得到的结果 sudo apt get install python3 pip Reading package lists Done Building dependency tree Reading state i
  • python: X 服务器上的致命 IO 错误 11(资源暂时不可用):0.0

    我正在尝试读取一些图像 稍后打算对它们执行一些任务 同时将图像读入内存 我想显示动画 gif 图像 为此 我必须使用线程 现在它给出错误 python Fatal IO error 11 Resource temporarily unava
  • 通过 Python 在 PostgreSQL 中的 unicode 字符串中是否允许空字节?

    unicode 字符串中是否允许空字节 我不问 utf8 我的意思是 unicode 字符串的高级对象表示 背景 我们通过 Python 在 PostgreSQL 中存储包含空字节的 unicode 字符串 如果我们再次读取字符串 字符串会
  • 将带有非字符串关键字的 dict 传递给 kwargs 中的函数

    我使用具有签名功能的库f args kwargs 我需要在 kwargs 参数中传递 python dict 但 dict 不包含关键字中的字符串 f 1 2 3 4 Traceback most recent call last File
  • 可重用的 Tensorflow 卷积网络

    我想重用来自Tensorflow 专业人士的 MNIST CNN 示例 http www tensorflow org tutorials mnist pros index md 我的图像尺寸为 388px X 191px 只有 2 个输出
  • 从文件中读取单词并放入列表中

    本质上 我有一个巨大的文件 所有文件包含每行多个单词 每个单词用空格分隔 有点像这样 WORD WORD WORD WORD ANOTHER WORD SCRABBLE BLAH YES NO 我想要做的是将文件中的所有单词放入一个巨大的列
  • Emacs:调试Python的方法

    我把这个贴在程序员 stackexchange com https softwareengineering stackexchange com questions 29844 emacs methods for debugging pyth
  • Python 对象属性 - 访问方法

    假设我有一个具有某些属性的类 在 Pythonic OOP 中 如何访问这些属性是最好的 就像obj attr 或者也许编写 get 访问器 此类事物可接受的命名风格是什么 Edit 您能否详细说明使用单下划线或双前导下划线命名属性的最佳实
  • 将 Matlab MEX 文件中的函数直接嵌入到 Python 中

    我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些仿真结果 当然没有可用的源代码 Matlab 的接口实际上非常简单 因为只有一个函数 返回一个 Matlab 结构体 我想知道是否有任何方法可以直接从Python调用M
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • 在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

    编码社区的成员比我更聪明 我有一个 python 问题要问你们 我正在尝试优化一个 python 脚本 该脚本 除其他外 返回子进程执行和终止的挂钟时间 我想我已经接近这样的事情了 startTime time time process s
  • 使用 JSON 可序列化枚举自动生成棉花糖模式

    创建与我的模型相同的棉花糖模式的日子已经一去不复返了 我发现这个优秀的答案 https stackoverflow com a 42892443 4097322这解释了我如何使用简单的装饰器从 SQA 模型自动生成模式 因此我实现了它并替换
  • Windows 10 上的 Tensorflow 安装问题

    我正在尝试在 Win 10 计算机上安装 Tensorflow 我成功安装了Python 3 7 然后尝试按照tensorflow org上的安装说明进行操作 执行时 pip install tensorflow 我收到以下错误消息 错误
  • Python中如何实现相对导入

    考虑 stuff init py mylib py Foo init py main py foo init py script py script py想要进口mylib py 这只是一个示例 但实际上我只想在父目录中进行模块的相对导入
  • 如何访问模板缓存? - 姜戈

    I am 缓存 HTML在几个模板内 例如 cache 900 stats stats endcache 我可以使用以下方式访问缓存吗低级图书馆 例如 html cache get stats 我确实需要对模板缓存进行一些细粒度的控制 有任

随机推荐

  • 通过Android Studio 将yolov5部署到手机端(2023新手最新适用版)

    通过Android Studio 将yolov5部署到手机端 2023新手最新适用版 java17安装 下载java17 Java Downloads Oracle 配置环境变量 这个是我安装后的路径 将这个路径复制 设置环境变量 在系统变
  • Qt技巧:QProcess与外部程序的调用

    项目做到一定阶段 常常须要在原来的project上调用外部程序 Qt为此提供了QProcess类 QProcess可用于完毕启动外部程序 并与之交互通信 一 启动外部程序的两种方式 1 一体式 void QProcess start con
  • NFS服务安装配置(centos7 nfs-utils示例)

    测试机器 nps server 10 166 205 104 nfs client 10 166 205 101 server端 安装nfs utils和rpcbind sudo yum install nfs utils rpcbind
  • np.random里让你迷糊的随机数函数到底咋区分(结合tensorflow)

    小测 numpy以下哪个函数不能产生正态分布的随机数 A standard normal B randn C random D normal 从 0 1 范围的标准分布中产生1个随机数 以下哪个numpy函数是错误的 A rand B ra
  • Sort 【HDU - 5884】【哈夫曼树】

    题目链接 一开始看到题的时候 竟然读成了是按照升序排序的一串数 害得我WA了两发 还以为是补0补错了 研究了一会补0发现好像没有多大问题 然后就继续了 直到再看了遍题 发现好像是没有给你拍好序的 然后AC 这道题其实哈夫曼树不难 就是补0思
  • 【信创】麒麟操作系统配置在线源及手动查找所需软件包

    获取操作系统信息 命令 nkvers 关注倒数第2行 示例中大版本 V10 小版本 SP2 CPU架构 aarch64 root localhost nkvers Kylin Linux Version Release Kylin Linu
  • ThreadLocal原理以及其安全问题

    ThreadLocal 是一个线程内共享数据的类 其原理是在线程有一个 ThreadLocalMap key是ThreadLocal对象 value是自定义的数据 所以在同一个线程中 用同一个threadlocal去get数据 能取到同样的
  • ansible 离线部署

    1 安装 python 环境 wget https mirrors bfsu edu cn anaconda archive Anaconda3 2022 10 Linux x86 64 sh sh Anaconda3 2022 10 Li
  • VUE+echart绘制地图(伪3D)

    这里以宝鸡地图为示例 其他地图只需更换地图JSON 地图JSON获取通过阿里的datav 地址 阿里云地图获取工具 和data数值即可 效果图如下 首先我们需要创建一个div来盛放地图 这里的div必须给出对应的宽和高 不然地图无法显示 t
  • JavaSE核心API

    还在更新中 没有JavaSE基础的小伙伴可以先看看这篇哦 写的非常的详细 Java语言基础 文章目录 API介绍以及文档的使用 文档注释的规范 Javadoc生成项目文档 String的介绍 重写equals方法 字符串常量池 String
  • 帮你快速理解什么是MFC(Windows环境下)

    我是荔园微风 作为一名在IT界整整25年的老兵 今天总结一下Windows环境下的MFC到底是一个什么技术 早在1998年 MFC绝对是技术界的一个热门名词 现在似乎提的人很少 但其他MFC的很多程序仍在世界上各个角落运行着 做为一名系统架
  • 静态测试 vs 动态测试

    静态测试 静态测试又可分为代码走查 Walkthrough 代码审查 Inspection 技术评审 Review 代码走查 Walkthrough 开发组内部进行的 采用讲解 讨论和模拟运行的方式进行的查找错误的活动 代码审查 Inspe
  • (二)Jupyter Notebook, numpy, matplotlib的使用

    笔记 机器学习入门专栏笔记对应jupyternotebook以及封装的各种算法个人笔记 如有错误 感谢指出 机器学习文档类资源 CSDN文库 二 Jupyter Notebook numpy matplotlib的使用 下载anaconda
  • 微信扫码登录详细操作流程(微信公众平台开发)

    在平常的业务开发中 经常会涉及到扫码登录的案例 下面我将对扫码登录流程做简要概述 1 概念 首先需要清楚的是扫码登录大体上有两种实现方式 重点 一种是基于微信公众平台的扫码登录 另一种是基于微信开放平台的扫码登录 注意这两个平台一定要区分开
  • org.mybatis.generator.exception.XMLParserException: XML Parser Error on line 12: 对实体 “useUnicode“ 的

    org mybatis generator exception XMLParserException XML Parser Error on line 12 对实体 useUnicode 的引用必须以 分隔符结尾 在使用mybatis逆向工
  • shell编程基础

    1 它必须以如下行开始 必须放在文件的第一行 bin sh 符号 用来告诉系统执行该脚本的程序 本例使用 bin sh 编辑结束并保存后 如果要执行该脚本 必须先使其可执行 chmod x filename 此后在该脚本所在目录下 输入 f
  • 华为OD机试 - 字符串变换最小字符串(Java)

    题目描述 给定一个字符串s 最多只能进行一次变换 返回变换后能得到的最小字符串 按照字典序进行比较 变换规则 交换字符串中任意两个不同位置的字符 输入描述 一串小写字母组成的字符串s 输出描述 按照要求进行变换得到的最小字符串 备注 s是都
  • Oracle环境变量配置

    情况描述 最近在配置plsql环境后 plsql总是连接不上 由于对自己的记忆力过度自信 导致这个简单的问题不能得到解决 现在记录下来作为以后的参考 一 客户端安装 官网下载orcle对应版本的客户端 然后执行安装 二 环境变量 需要配置以
  • Futter 屏幕适配框架flutter_ScreenUtil 用法

    参考 前言 各位同学大家好 大家在做app开发的时候都会遇到屏幕适配的问题 安卓里面有dp iOS里面有pt 单位给我们用来处理屏幕适配 除此之外安卓还有 autosize等框架给我们使用 iOS也对应屏幕适配方案给我们使用 那么在flut
  • 基于Python的接口自动化unittest测试框架和ddt数据驱动详解

    这篇文章主要介绍了基于Python的接口自动化unittest测试框架和ddt数据驱动详解 本文给大家介绍的非常详细 对大家的学习或工作具有一定的参考借鉴价值 需要的朋友可以参考下 目录 引言 一 unittest测试框架 二 ddt数据驱