Python的接口自动化-unittest测试框架和ddt数据驱动

news2024/12/23 23:52:35

目录

引言

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

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()我们只需将上面代码,稍微修改即可

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

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数据驱动

   在进行接口测试时,参考接口文档说明每个接口测试可以设计诸多测试case,即接口数据设计可以多种,比如正常接口数据、各种异常接口测试数据等,可以发现同一个接口用例除了传参不同外,接口脚本并没有什么区别,无非就是输入不同接口数据,输出对应的接口测试接口。这个时候就可以利用ddt来管理测试数据,同一个接口用例传入不同的测试数据即可,接口脚本可以根据传入的测试数据运行多次,从而提高代码的复用性。ddt全称:data driver test数据驱动测试,是一个第三方模块,一般和unittest框架结合起来应用,单独安装即可,如使用pip安装。以下通过实例来看看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()

 运行后输出如下:

 (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框架的结合就可以实现测试用例脚本编写、测试执行控制以及测试数据的批量加载,从而完成不同接口测试用例的批量执行和覆盖测试不同测试场景。


最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

在我的QQ技术交流群里(技术交流和资源共享,广告勿扰)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#include < > 和#include ” ”有什么区别?

C语言头文件 C语言中头文件的扩展名为 .h的头文件&#xff0c;头文件中包含了函数的声明和宏定义&#xff0c;头文件可以被多个源文件引用。在C语言中有两种类型的头文件&#xff0c;一种是编译器自带的头文件&#xff0c;另一种就是程序员自己编写的头文件。 在C程序中如果要使…

package和import关键字的使用

package(包) package&#xff0c;称为包&#xff0c;用于指明该文件中定义的类、接口等结构所在的包。 8.1.1 语法格式 package 顶层包名.子包名 ; 包的作用 • 包可以包含类和子包&#xff0c;划分项目层次&#xff0c;便于管理 • 控制访问权限 import(导入) 为了使用定…

python基础知识(十三):numpy库的基本用法

目录 1. numpy的介绍2. numpy库产生矩阵2.1 numpy将列表转换成矩阵2.2 numpy创建矩阵 3. numpy的基础运算4. numpy的基础运算25. 索引 1. numpy的介绍 numpy库是numpy是python中基于数组对象的科学计算库。 2. numpy库产生矩阵 2.1 numpy将列表转换成矩阵 import numpy as …

中国人民大学与加拿大女王大学金融硕士——不断充实自己的知识库

在职场我们总是悄无声息的崩溃又悄无声息的自愈。别人拥有的&#xff0c;只要努力&#xff0c;你也会拥有。真正的成功源于生命里的学习&#xff0c;成长和热爱&#xff0c;以及不停步。一直前向走就是巅峰&#xff0c;中国人民大学与加拿大女王大学金融硕士助力我们在职提升。…

锂电池移动电源等电信终端产品配套用电源适配器/充电器产品纳入CCC范围

2023年8月1日起&#xff0c;以下三类产品纳入CCC认证范围&#xff1a; 1、便携式产品用锂离子电池和电池组(0915) 2、移动电源(0914) 3、电信终端产品配套用电源适配器/充电器(0807, 0907) 以上文章来源网络&#xff0c;如有涉及侵权&#xff0c;请联系删除&#xff01;我们一直…

部署Alertmanager对prometheus监控检测飞书报警通知

告警效果 一、编写alertmanager.yml 创建个目录存放alertmanager.yml文件 mkdir -p /data/alertmanager vi alertmanager.ymlroute:group_by: [alertname]group_wait: 30sgroup_interval: 30srepeat_interval: 1mreceiver: web.hook receivers:- name: web.hookwebhook_confi…

独立站买家必知的支付方式优缺点_FP独立站卖家必知的安全收款方式

做独立站该怎么收款是卖家首要考虑&#xff0c;除去衡量费用是否有潜在费用&#xff0c;更重要的能否符合消费者的付款习惯&#xff0c;销售的产品不同市场不同&#xff0c;所用到的收款方式也不相同。那么独立站的支付方式都有哪些呢&#xff1f;他们各有什么优缺点&#xff1…

HarmonyOS学习路之开发篇—Java UI框架(StackLayout)

StackLayout StackLayout直接在屏幕上开辟出一块空白的区域&#xff0c;添加到这个布局中的视图都是以层叠的方式显示&#xff0c;而它会把这些视图默认放到这块区域的左上角&#xff0c;第一个添加到布局中的视图显示在最底层&#xff0c;最后一个被放在最顶层。上一层的视图…

硅晶片的清洗技术

引言 高质量的晶圆在晶体精度、成型质量和表面质量方面都很优越&#xff0c;所以增加LSIs&#xff08;大规模集成电路&#xff09;的集成密度需要更高质量的硅晶片&#xff0c;但我们必须考虑芯片尺寸和制造成本增加的问题。它们会导致互连故障和晶体缺陷&#xff0c;退化设备…

可视化分析碳化硅产业,我国2022年碳化硅功率器件应用规模达近百亿元

碳化硅&#xff08;SiC&#xff09;&#xff0c;又叫金刚砂&#xff0c;它是第三代化合物的半导体原材料。在新能源市场行业发展的推动下&#xff0c;能源的高效率利用转化&#xff0c;带动了碳化硅&#xff08;SiC&#xff09;产业市场的快速发展。 下面我们来利用可视化图表…

DSDP140B 57160001-ACX

​ DSDP140B 57160001-ACX DSDP140B 57160001-ACX 单相漏电保护器可以接在三相四线制电路中使用 单相漏电维护器不可以接在三相四线制电路中使用。术有专攻&#xff0c;单相漏电开关在漏电维护器内部装置的零序电流互感器检测的是一根相线&#xff08;前方&#xff09;和一…

GitHub如何申请学生包(Student Developer Pack),多次被拒绝总结的经验。

申请地址点这里&#xff1a; 说一下我的背景&#xff0c;我是有学校的教育邮箱的。但是现在申请用不用教育邮箱都可以了&#xff0c;所有邮箱都可以了。但是有教育邮箱最好还是用教育邮箱吧。 我先后申请了20多次&#xff0c;最后终于通过了。 申请失败的邮件表情是那个无语的…

011 - STM32学习笔记 - 串口通讯

011 - STM32学习笔记 - 串口通讯 关于串口的相关概念各位可以在网上查一下相关介绍&#xff0c;这里直接开始学习STM32上的串口配置和通讯测试了 在学习相关寄存器之前&#xff0c;先看一下USART的功能框图 1、USART引脚 引脚名称引脚功能TX数据发送端RX数据接收端SW_RX单线…

VMWare中Centos7部署K8S集群

关于我们要搭建的K8S&#xff1a; Docker版本&#xff1a;docker-ce-19.03.9&#xff1b;K8S版本&#xff1a;1.20.2&#xff1b;三个节点&#xff1a;master、node1、node2&#xff08;固定IP&#xff09;&#xff1b;容器运行时&#xff1a;仍然使用Docker而非Containerd&am…

软考A计划-2023系统架构师-知识点集锦(1/4)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Haproxy搭建负载均衡

Haproxy搭建负载均衡 一、常见的Web集群调度器二、Haproxy介绍1、Haproxy应用分析2、Haproxy的主要特性3、Haproxy负载均衡策略 三、LVS、Nginx、Haproxy之间的区别四、Haproxy搭建Web群集1、Haproxy服务器部署2、节点服务器部署3、测试Web群集 五、日志定义1、方法一2、方法二…

DVWA-XSS (Reflected)

大约 “跨站点脚本 &#xff08;XSS&#xff09;”攻击是一种注入问题&#xff0c;其中恶意脚本被注入到原本良性和受信任的网站上。 当攻击者使用 Web 应用程序发送恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;时&#xff0c;就会发生 XSS 攻击&#xff0c; 给…

企业数字化转型,想要易部署、低成本、高安全,看这里

随着数字化转型成为国家战略&#xff0c;不同行业的组织都在极力实行数字化转型战略。近几年企业工作方式的转型中&#xff0c;越来越多的传统本地办公模式向云上演进&#xff0c;远程办公、在线协作成为企业高效办公的重要支撑。 赞奇科技联合华为&#xff0c;基于华为云桌面W…

【实战】Chatglm微调指引和部署(MNN)

一. Chatglm 相对简单&#xff0c;而且微调之后性能比较奇怪&#xff0c;可以参考ChatGLM-6B 的部署与微调教程 1.1 MNN部署 https://github.com/wangzhaode/ChatGLM-MNN 1.1.1 Linux部署 git clone https://github.com/wangzhaode/ChatGLM-MNN.git&#xff08;1&#xff…

一、枚举类型——枚举类型的基本特性

enum关键字用于创建一个新类型&#xff0c;其中包含一组数量有限的命名变量&#xff0c;并视这些变量为常规程序组件。实践表明这是一种非常有用的类型 你可以调用枚举类型中的 values() 方法来遍历枚举常量列表。values() 方法生成一个由枚举常量组成的数组&#xff0c;其中常…