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

青岛网站搜索排名网络营销与策划

青岛网站搜索排名,网络营销与策划,在网上那里能接单做网站,做网站推广见客户的话术什么是数据驱动? 数据驱动是指测试数据的变更从而驱动自动化测试的执行,最终引起测试结果的改变。 如测试登录接口,在使用数据驱动前是这样的(以下代码只是简写,并不规范): 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.qdjiajiao.com/news/12857.html

相关文章:

  • 织梦做的网站打不开网页达内教育
  • 沈阳定制网站制作软文广告属于什么营销
  • html5结构的网站百度百家号注册
  • 佛山网站建设 奇锐科技广告推广的软件
  • 网站集约化建设什么意思廊坊seo外包公司费用
  • 海宁网站建设公司推荐上海百度竞价点击软件
  • 广州市公司网站建设价格郑州seo询搜点网络效果佳
  • 网站模板但没有后台如何做网站steam交易链接怎么获取
  • 网站开发中的著作权归属医院线上预约
  • 网站建设技术线路选择成都网站seo技巧
  • 网站推广怎么优化301313龙虎榜
  • 芜湖住房和城乡建设委员会网站自己创建一个网站需要多少钱
  • 加强政府门户网站建设通知网站seo属于什么专业
  • wordpress 主题翻译重庆网站seo好不好
  • 做网站维护工资多少合肥百度关键词推广
  • 怎么做网站弹出公告seo公司发展前景
  • 3g网站制作武汉搜索引擎排名优化
  • 网页翻译网站可以推广赚钱的软件
  • 什么网站可以做医疗设备的怎样打百度人工客服热线
  • 福州专业做网站的公司58网络推广
  • 做银行应该关注的网站网络优化初学者难吗
  • 网络广告是较为常见的一种网络营销方式seo外链优化方法
  • 重庆网站icp备案查询百度爱采购平台登录
  • 服务器做jsp网站教程视频播放如何加入百度推广
  • 百度收录新网站网站模板定制
  • 网站自己做服务器正规seo关键词排名网络公司
  • 成都淮州新城建设投资有限公司网站谷歌seo运营
  • 网站开发公司杭州网站建设营销宣传方式有哪些
  • 网站的banner做多大郑州网站制作工具
  • 商城网站制作方案seo标题优化裤子关键词