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

基于Python的接⼝⾃动化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:测试夹件,主要⽤于测试⽤例的前置初始化和执⾏后的销毁。
新建⼀个的.py测试⽤例⽂件必须是test开头,如test_login.py,主要后续⽤于识别测试⽤例⽂件编写测试⽤例的类,必须继承unittest.TestCase,做为测试类
测试类中⽤例的⽅法名称必须以test开头,⽤于识别测试⽤例数
测试类中的⽤例执⾏顺序,按照以test开头的⽅法后的Ascill码顺序执⾏(0~9,A~Z,a~z)
也叫测试夹具,主要是⽤例前置的初始化以及执⾏后的销毁
测试夹件提供两种⽅法,⼀种是⽅法级别的:setup()和teardown(),⼀种是类级别的:setUpClass()和tearDownClass()
⽅法级别的测试夹件,每⼀条测试⽤例执⾏之前与之后都要运⾏⼀次setup()和teardown();类级别的测试夹件,所有测试⽤例执⾏之前到执⾏完成只运⾏⼀次setUpClass()和tearDownClass()
机器人搬运setUp():每个测试case运⾏之前运⾏
tearDown():每个测试case运⾏完之后执⾏
setUpClass():必须使⽤@classmethod 装饰器,  所有case运⾏之前只运⾏⼀次
tearDownClass():必须使⽤@classmethod装饰器, 所有case运⾏完之后只运⾏⼀次
下⾯通过简单的代码⽰例看看TestCase与TestFixure的使⽤
(1)使⽤setup()和teardown(),创建test_666.py⽂件编辑如下代码:
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()我们只需将上⾯代码,稍微修改即可
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(测试⽤例的所在⽬录):指定⽬录去加载,会⾃动寻这个⽬录下所有符合命名规则的测试⽤例
testrunner就是⽤来执⾏测试⽤例的,并且可以⽣成相应的测试报告。测试报告有两种展⽰形式,⼀种是text⽂本,⼀种是html格式。
h tml格式的就是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
st_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\ E:/api_test/test_bak/run_case.py
<unittest.suite.TestSuite tests=[&st_unittest testMethod=test_1>, &st_unittest testMethod=test_a>]>
------------------
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<st_unittest testMethod=test_1>, <st_unittest ------------------
<unittest.suite.TestSuite tests=[&st_unittest testMethod=test_1>, &st_unittest testMethod=test_A>, &st_unittest testM Process finished with exit code 0
真空脱脂烧结炉
通过unittest框架下提供的加载⽤例的诸多⽅法,我们就可以单个或者批量加载⽤例,后续可以将加载的⽤例集引⼊到
HTMLTestRunner.py模块⽣成可视化的测试报告
5.assert----测试断⾔
⽆论是什么样的测试⽤例,最后都需要有⽤例执⾏后的验证,在接⼝⾃动化测试中我们执⾏完接⼝⽤例也需要验证断⾔⽤例执⾏是否满⾜我
们的预期。unittest提供了丰富的断⾔⽅法,常见的断⾔如下表:
⼆、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()
运⾏后输出如下:

本文发布于:2024-09-22 10:36:01,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/276819.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:测试   加载   框架   提供
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议