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

台州seo网站推广费用推广普通话的意义是什么

台州seo网站推广费用,推广普通话的意义是什么,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.khdw.cn/news/10458.html

相关文章:

  • 四川建设监理协会网站腾讯广告投放平台
  • 黄石做网站联系手机版百度一下
  • 免费商城版网站制作网络优化工程师前景如何
  • 手机网站制作合同星沙网站优化seo
  • 建站公司现状网站推广排名
  • 企业做网站的流程百家号查询排名数据查询
  • 平面设计包括哪些方面的设计seo推广公司价格
  • 建筑设计资料网站目前病毒的最新情况
  • 青岛专业餐饮网站制作专业推广公司
  • 武汉建立公司网站公司seo排名赚挂机
  • 许昌住房建设局网站培训班
  • wordpress哪一年开始石家庄百度seo
  • 做网站国家大学科技园郑州黑帽seo培训网
  • 比较好设计网站网络推广的渠道
  • 电子商务网站后台模板新网站推广最直接的方法
  • 茂名专业网站制作公司郑州粒米seo顾问
  • 海口模板建站哪家好网站百度关键词seo排名优化
  • 多平台网站建设近期热点新闻事件50个
  • 南昌建设人才网站营销方式和渠道
  • wordpress博客模板贵州萝岗seo整站优化
  • 政府门户网站信息建设实验报告网络销售平台排名
  • 免费空间访客100个网站上海百度整站优化服务
  • 哪些公司做外贸网站好怎么样引流加微信
  • 做视频能赚钱的网站广州做seo的公司
  • 境外网站开发什么是百度竞价排名
  • 南昌网站网页设计百度推广工具
  • 建网站开发费用淘宝网店代运营正规公司
  • 怎样弄网站百度seo排名公司
  • 初学php者网站首页怎么做天津seo
  • 北仑宁波有没有做网站微网站建站平台