当前位置: 首页 > news >正文

徐州模板网站全球最顶尖的设计公司

徐州模板网站,全球最顶尖的设计公司,百度指数功能有哪些,如何用微信分享wordpress什么是数据驱动? 数据驱动是指测试数据的变更从而驱动自动化测试的执行,最终引起测试结果的改变。 如测试登录接口,在使用数据驱动前是这样的(以下代码只是简写,并不规范): def login_succes…

什么是数据驱动?

数据驱动是指测试数据的变更从而驱动自动化测试的执行,最终引起测试结果的改变。

如测试登录接口,在使用数据驱动前是这样的(以下代码只是简写,并不规范):

def login_success():username = "John"password = "123456"expected_result = "success"login(username,password)#断言等操作def login_fail_username_undefined():username = "tom"password = "123456"expected_result = "error"login(username,password)#断言等操作def login_fail_password_wrong():username = "John"password = "000000"expected_result = "error"login(username,password)#断言等操作

使用username = “John”,password = "123456"作为数据,执行测试用例的时候断言是成功的,也就是说登录是成功的;换成username = “tom”,password = "123456"作为数据,执行测试用例的时候断言是失败的,也就是说登录是失败的。由此可看出,测试数据不一样,测试的结果也会不一样;反过来,我想得到什么样的结果,我就得对应的使用能驱使产生这一结果的数据。这就是数据驱动测试的思想。
有了这种思想的指导,我们进而能实现数据与代码的分离。上面的例子我们可以看到,除了数据不一样之外,下面的(1)调用接口返回实际结果(2)预期结果与实际结果进行断言的操作每个测试用例都是一样的。这时我们可以想,把(1)(2)步骤封装在同一个方法里,然后将测试数据用某种方式收集起来,最后用数据去驱动这三个步骤的执行,从而得到对应不同的结果。
由此看得出来,数据驱动的核心是将数据与代码抽离出来,实现数据与代码的解耦。这样一来,代码的逻辑就分成了两块:第一块是测试用例的准备,第二块是测试用例的执行。

为什么要数据驱动?

还拿上面代码的例子举例。过去都是有几个测试用例就写几个方法,这样的工作非常的重复且无效率,看起来特别低级。而我们把所有的测试数据收集起来,测试的代码都写在一个方法里,把测试数据当做参数传给方法去执行,这样一来就能节省很多重复的代码,效率也就提升了。

数据驱动的演变

受上面思想的启发,我们可以将测试数据用列表装起来,接着测试用例的代码都写在一个方法里,再在方法里去调用需要用到的测试数据。

第一阶段:测试数据放在列表中

import unittest
from unittest import TestCase#模拟的登录接口
def login(username=None, password=None):"""登录"""if (not username) or (not password):# 用户名或者密码为空return {"msg": "empty"}if username == 'John' and password == '123456':# 正确的用户名和密码return {"msg": "success"}return {"msg": "error"}#将数据从代码中抽离出来,单独用列表嵌套字典的方式存储
datas = [{"username": "John", "password": "123456", "expected_result": "success"},{"username": "tom", "password": "123456", "expected_result": "error"},{"username": "John", "password": "000000", "expected_result": "error"}
]#测试类
class test_login(unittest.TestCase):#测试方法,封装测试用例代码def test_login1(self):#将数据注入到测试代码中for data in datas:for param in data:username = data["username"]password = data["password"]expected_result = data["expected_result"]actual_result = login(username,password)["msg"]                TestCase.assertTrue(expected_result,actual_result)if __name__ == "__main__":unittest.main()

这样写下来,虽然测试数据是与测试用例的代码解耦了,但把测试数据全写出来未免显得过于臃肿,测试数据多了也不好管理。这时我们可以考虑将测试数据全放到excel中,然后读取excel的数据出来供测试代码使用。这样我们就进入到了下面的第二阶段。

第二阶段:测试数据存放在excel中

import unittest
from unittest import TestCase
from interface_test import excel_handler#模拟的登录接口
def login(username=None, password=None):"""登录"""if (not username) or (not password):# 用户名或者密码为空return {"msg": "empty"}if username == 'John' and password == '123456':# 正确的用户名和密码return {"msg": "success"}return {"msg": "error"}#测试类,测试数据的准备及测试用例的代码都在同一个类内用不同方法呈现
class test_login(unittest.TestCase):#准备测试数据方法。读取excel中的数据,将其作为结果返回def data_prepared(self):data = excel_handler.excel_handler("cases.xlsx").get_data("login")return data#测试方法,封装测试用例代码def test_login1(self):#调用测试数据准备的方法,获得所有的测试数据datas = self.data_prepared()#将数据注入到测试代码中for data in datas:for i in data:username = data[0]password = data[1]expected_result = data[2]actual_result = login(username,password)["msg"]TestCase.assertTrue(expected_result,actual_result)if __name__ == "__main__":unittest.main()

这个阶段只是将测试数据的准备做了优化,让测试数据更好管理。但在测试用例的执行中,我们遇到了一个新的问题。
下面是我们通过unittest执行测试用例的结果:
在这里插入图片描述
可看到我们准备的测试数据不止有一组,但结果返回的却只有一个。这说明只执行了第一组测试数据,后面的测试数据都没执行。究其原因是因为unittest只会以方法为单位来执行,也就是说一个方法对应一条测试用例。所以不管你准备了多少测试数据,你只在一个方法里面执行这些数据,那unittest只会把它当成一条测试用例,因此结果也只有一个。所以我们需要对测试用例的执行部分进行优化。

第三阶段 引入ddt模块

这时我们就需要使用到python的ddt模块来进行数据驱动。

python中的ddt是什么?

ddt(Data Driven Testing)是python的第三方模块,用来进行数据驱动。

ddt在框架中扮演什么样的角色?

ddt在接口自动化测试框架中负责两块内容:接收来自excel的数据;用数据驱动测试用例的执行。

ddt原理

要知道for循环为什么驱动不了unittest测试用例的执行,而ddt却能驱动的原因,得先知道ddt的原理。
下面是ddt源码中三个重要函数:ddt、unpack、data的代码:

def ddt(cls):"""Class decorator for subclasses of ``unittest.TestCase``.Apply this decorator to the test case class, and thendecorate test methods with ``@data``.For each method decorated with ``@data``, this will effectively create asmany methods as data items are passed as parameters to ``@data``.The names of the test methods follow the pattern``original_test_name_{ordinal}_{data}``. ``ordinal`` is the position of thedata argument, starting with 1.For data we use a string representation of the data value converted into avalid python identifier.  If ``data.__name__`` exists, we use that instead.For each method decorated with ``@file_data('test_data.json')``, thedecorator will try to load the test_data.json file located relativeto the python file containing the method that is decorated. It will,for each ``test_name`` key create as many methods in the list of valuesfrom the ``data`` key."""for name, func in list(cls.__dict__.items()):if hasattr(func, DATA_ATTR):for i, v in enumerate(getattr(func, DATA_ATTR)):test_name = mk_test_name(name, getattr(v, "__name__", v), i)test_data_docstring = _get_test_data_docstring(func, v)if hasattr(func, UNPACK_ATTR):if isinstance(v, tuple) or isinstance(v, list):add_test(cls,test_name,test_data_docstring,func,*v)else:# unpack dictionaryadd_test(cls,test_name,test_data_docstring,func,**v)else:add_test(cls, test_name, test_data_docstring, func, v)delattr(cls, name)elif hasattr(func, FILE_ATTR):file_attr = getattr(func, FILE_ATTR)process_file_data(cls, name, func, file_attr)delattr(cls, name)return cls
def unpack(func):"""Method decorator to add unpack feature."""setattr(func, UNPACK_ATTR, True)return func
def data(*values):"""Method decorator to add to your test methods.Should be added to methods of instances of ``unittest.TestCase``."""global index_lenindex_len = len(str(len(values)))return idata(values)

由此可看出,ddt的方法是unittest的TestCase的继承类,所以ddt是要跟unittest结合使用的。把ddt这个装饰器定义在测试类上,然后在每个测试方法上定义data这个装饰器,由此每个上面定义了data装饰器的方法都会创建多个与data里数据组数一样多的方法与每一组的数据相匹配。举个例子,如果你有一组数据:[a,b,c],那么会分别创建与三个与a、b、c对应的方法。每一个方法里面的代码内容是一样的,但是用到的数据会不一样。

代码实操

import unittest
import ddt"""
使用ddt步骤
1.导入ddt:import ddt
2.在需要使用ddt的class上面加上装饰器:@ddt.ddt
3.在需要准备测试用例数据的方法上加上装饰器:@ddt.data(*data_name) 其中data_name可以是事先定义的列表、字典等,也可以是
通过openpyxl获取的excel数据
4.方法中传入变量用于接收数据
"""
def login(username=None, password=None):"""登录"""if (not username) or (not password):# 用户名或者密码为空return {"msg": "empty"}if username == 'yuz' and password == '123456':# 正确的用户名和密码return {"msg": "success"}return {"msg": "error"}#通过导入excel_handler类的get_data方法获取excel中的数据
from interface_test.excel_handler import excel_handler
data = excel_handler("cases.xlsx").get_data("login")#在测试类上加上装饰器:@ddt.ddt
@ddt.ddt
class test_login(unittest.TestCase):#在需要使用数据的方法上加上装饰器:@ddt:data@ddt.data(*data)def test_login(self,cases):#由于excel中的数据是字符串类型的,所以需要把字符串类型转换成列表datas = eval(cases["data"])#准备测试数据username = datas["mobile_phone"]password = datas["pwd"]#调用接口返回实际结果actual_result = login(username,password)#预期结果expected_result = '{"msg":"success"}'#预期结果及实际结果进行断言self.assertTrue(actual_result,expected_result)

执行结果:
在这里插入图片描述

http://www.yayakq.cn/news/953510/

相关文章:

  • 长沙手机网站设计设计类专业有哪些专业
  • 赣州企业网站建设公司手机可以开发网站
  • 农业电商网站建设ppt网站查询访问
  • 电子商务网站的规划与分析内网访问wordpress很慢
  • 企业网站开发注意什么天津市住房和城乡建设部网站
  • 企业3合1网站建设电话企业网站建设应遵守的原则
  • 网站页脚怎么做wordpress anspress
  • 怎么做动漫网站ppt制作
  • .design 域名的网站网站建设实训报告的内容怎么写
  • 又拍网站怎么做国外搜索引擎排行榜
  • 门户网站营销策略dedecms仿站教程
  • 有专门做背景音乐的网站吗为什么一个人做网站有难度
  • 专家库 网站 建设方案网站如何集成微信支付
  • 哈尔滨模板建站服务商什么是建设型的网站
  • 电子商务网站建设管理论文建设发展公司网站
  • 江苏省医院网站建设管理规范常州公司建站模板
  • wordpress个人博客建站wordpress个人中心页
  • 做家教网站如何招生十种网络推广的方法
  • 如何用织梦搭建网站wordpress404错误
  • 怎么在百度上建立网站wordpress注册用户邮件验证
  • 网站建设费可分摊几年怎样制作公司的网页
  • 宿城区住房和城乡建设局网站营销型网站制作哪家好
  • 网站模板 介绍网站界面设计教程
  • flash做的小动画视频网站flash怎么做电子书下载网站
  • 网站建设一般多少钱官网网页设计与开发第四版答案
  • 长宁区公司网站建设wordpress 连接后台
  • 中小企业网站建设策划苏州模板做网站
  • 网站建设核心提供网站建设搭建
  • 一个网站做多少个关键词比较好南通网站seo报价
  • 好公司网站建设价格杭州巴顿设计公司官网