引言

在编写接口自动化用例时,我们一般针对一个接口建立一个.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. import unittest
  2.  
  3. class test_unittest(unittest.TestCase):
  4. def setUp(self):
  5. print("测试环境初始化,开始执行setup")
  6.  
  7. def tearDown(self):
  8. print("测试执行完成,运行teardown")
  9. print("------------------------------")
  10. def test_a(self):
  11. print("开始执行test_a用例")
  12.  
  13. def test_A(self):
  14. print("开始执行test_A用例")
  15.  
  16. def test_1(self):
  17. print("开始执行test_1用例")
  18.  
  19. def notest_1(self):
  20. print("不执行notest_1用例")
  21.  
  22. if __name__ == "__main__":
  23. unittest.main()

执行后,输出如下:

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

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

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

  1. import unittest
  2.  
  3. class test_unittest(unittest.TestCase):
  4. @classmethod
  5. def setUpClass(cls):
  6. print("测试环境初始化,开始执行setup")
  7. @classmethod
  8. def tearDownClass(cls):
  9. print("测试执行完成,运行teardown")
  10. print("------------------------------")
  11. def test_a(self):
  12. print("开始执行test_a用例")
  13.  
  14. def test_A(self):
  15. print("开始执行test_A用例")
  16.  
  17. def test_1(self):
  18. print("开始执行test_1用例")
  19.  
  20. if __name__ == "__main__":
  21. 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. import unittest
  2. from test.test_666 import test_unittest
  3.  
  4. # 单个用例加载
  5. suite = unittest.TestSuite()
  6. case1 = test_unittest('test_1')
  7. case2 = test_unittest('test_a')
  8. suite.addTest(case1)
  9. suite.addTest(case2)
  10. print(suite)
  11. print("------------------")
  12. # 批量用例加载
  13. case_path = r"E:\api_test\test"
  14. # 按文件路径加载,注意该文件为包文件即文件下有__init__.py
  15. all_case = unittest.defaultTestLoader.discover(case_path,pattern="test_666*.py",top_level_dir=None)
  16. all_case1 = unittest.defaultTestLoader.loadTestsFromTestCase(test_unittest) # 按类名称加载
  17. print(all_case)
  18. print("------------------")
  19. print(all_case1)

 输出结果如下:

  1. E:\api_test\Scripts\python.exe E:/api_test/test_bak/run_case.py
  2. <unittest.suite.TestSuite tests=[<test.test_666.test_unittest testMethod=test_1>, <test.test_666.test_unittest testMethod=test_a>]>
  3. ------------------
  4. <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>]>]>]>
  5. ------------------
  6. <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>]>
  7.  
  8. 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)输入简单的参数:单个值、列表、元祖、字典
  1. import unittest
  2. from ddt import data,unpack,ddt
  3.  
  4. @ddt
  5. class myddt(unittest.TestCase):
  6.  
  7. @data("123") # 单个值
  8. def test1(self,testdata1):
  9. print(testdata1)
  10. print("------------------")
  11.  
  12. @data([1,2,3],[4,5,6]) # 列表
  13. def test2(self,testdata2):
  14. print(testdata2)
  15. print("------------------")
  16. """
  17. @data((1, 2, 3)) # 元组
  18. def test2(self, testdata3):
  19. print(testdata3)
  20. print("------------------")
  21.  
  22. @data({'zhangshan':1,'wangwu':2,'lisi':3}) # 字典
  23. def test2(self, testdata4):
  24. print(testdata4)
  25. print("------------------")
  26. """
  27. if __name__ == '__main__':
  28. unittest.main()

 (2)使用@unpack对复杂数据结构,如元组、列表数据进行分解

代码示例:

  1. import unittest
  2. from ddt import data,unpack,ddt
  3.  
  4. @ddt
  5. class myddt(unittest.TestCase):
  6.  
  7. @data([1,2],[3,4]) # 列表
  8. @unpack
  9. def test2(self, testdata1,testdata2):
  10. print("拆解的第一个参数:",testdata1)
  11. print("拆解的第二个参数:", testdata2)
  12. print("------------------")
  13.  
  14. if __name__ == '__main__':
  15. unittest.main()

 运行后输出如下:

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

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

  1. import unittest
  2. from ddt import file_data,ddt
  3.  
  4. @ddt
  5. class myddt(unittest.TestCase):
  6.  
  7. @file_data(r"E:\api_test\test\data.json")
  8. def test1(self, *value):
  9. print(value)
  10.  
  11. if __name__ == '__main__':
  12. unittest.main()

 通过ddt和unittest框架的结合就可以实现测试用例脚本编写、测试执行控制以及测试数据的批量加载,从而完成不同接口测试用例的批量执行和覆盖测试不同测试场景。

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

  1. Python3-unittest测试框架之DDT数据驱动

    unittest测试框架之DDT数据驱动 ddt的使用 DDT数据驱动 DDT:Data Driver Test(数据驱动测试) 数据驱动思想:数据和用例进行分离,通过外部数据去生成测试用例 安装 p ...

  2. 基于Python的接口自动化-01

    为什么要做接口测试 当前互联网产品迭代速度越来越快,由之前的2-3个月到个把月,再到班车制,甚至更短,每次发版之前都需要对所有功能进行回归测试,在人力资源有限的情况下,做自动化测试很有必要.由于UI更 ...

  3. 基于Python的接口自动化实战-基础篇之pymysql模块操作数据库

    引言 在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操作是否正确等.因此,在进行接口自动化测试时,我们一样绕不开接 ...

  4. 基于Python的接口自动化-读写excel文件

    引言 使用python进行接口测试时常常需要接口用例测试数据.断言接口功能.验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来 ...

  5. Python+requests接口自动化完整项目框架整理笔记

    前言 通过学习"上海悠悠"博客,自己手动敲了一遍整体的自动化项目搭建,编写用例,打印log日志,生成测试报告,将报告发送至邮箱整体流程跑了一遍,勉强跑通了 一,项目结构 --cas ...

  6. 基于Python的接口自动化实战-基础篇之读写配置文件

    引言 在编写接口自动化测试脚本时,有时我们需要在代码中定义变量并给变量固定的赋值.为了统一管理和操作这些固定的变量,咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中,后续需要用到这些变量和变 ...

  7. 基于Python的接口自动化

    第一步 Python的安装配置 打开官网: https://www.python.org/downloads/ 目前官网上已经更新到3.6.1啦,有两个版本,大家可以按自己喜欢的去下载,我自己选择的是 ...

  8. python+request接口自动化框架

    python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...

  9. python+pytest接口自动化(11)-测试函数、测试类/测试方法的封装

    前言 在python+pytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码 ...

随机推荐

  1. SpringCloud 的版本问题 (深入)

    学过SpringCloud 的 同学 ,就应该知道,SpringCloud是一个生态 . Spring Cloud是一个由众多独立子项目组成的大型综合项目,每个子项目都维护着自己的发布版本号.Spri ...

  2. 开发你的第一个NCS(Zephyr)应用程序

    Nordic有2套并存的SDK:老的nRF5 SDK和新的NCS SDK,两套SDK相互独立,大家选择其中一套进行开发即可.一般而言,如果你选择的芯片是nRF51或者nRF52系列,那么推荐使用nRF ...

  3. 服务器安装PVE6.1.2

    1     去官网下载PVE的镜像文件 https://www.proxmox.com/en/downloads 2     制作成U盘启动 准备一个U盘用来制作启动盘(记得将U盘里原来的资料备份然后 ...

  4. 加班申请单flowable中

    /* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source ...

  5. [LeetCode]234. Palindrome Linked List判断回文链表

    重点是: 1.快慢指针找到链表的中点.快指针一次走两步,慢指针一次走一步,分清奇偶数情况. 2.反转链表.pre代表已经反转好的,每次将当前节点指向pre /* 快慢指针得到链表中间,然后用206题方 ...

  6. [leetcode]543. Diameter of Binary Tree二叉树的直径

    题目中的直径定义为: 任意两个节点的最远距离 没想出来,看的答案 思路是:diameter = max(左子树diameter,右子树diameter,(左子树深度+右子树深度+1)) 遍历并更新结果 ...

  7. Android驱动学习-内部机制_回顾binder框架关键点

    内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie cli ...

  8. TurtleBot3使用课程-第二节a(北京智能佳)

    目录 1.[第3类]LRF(LDS)传感器 2 1.1 传感器包安装 2 1.1.1 传感器端口访问设置 2 1.1.2 运行hlds_laser_publisher节点 2 1.1.3 在RViz中 ...

  9. 第四章节 BJROBOT 线速度校正 【ROS全开源阿克曼转向智能网联无人驾驶车】

    BJROBOT 线速度校正   1.把小车平放在地板上,用卷尺作为测量刻度,选取车头或者车尾处作为小车的起点, 打开资料里的虚拟机,打开一个终端 ssh 过去主控端启动 roslaunch znjro ...

  10. vue调起微信扫一扫

    vue调起微信扫一扫,两个注意的点 1.url必须是不带参的地址栏,如果传了带参数的地址url有可能会出现安卓机能调,苹果机报错或者安卓和苹果都报错 2.this指代问题在vx.ready等等方法里面 ...