功能点算法及在软件测试中的应用Word格式.docx

上传人:b****3 文档编号:17627709 上传时间:2022-12-07 格式:DOCX 页数:11 大小:27.40KB
下载 相关 举报
功能点算法及在软件测试中的应用Word格式.docx_第1页
第1页 / 共11页
功能点算法及在软件测试中的应用Word格式.docx_第2页
第2页 / 共11页
功能点算法及在软件测试中的应用Word格式.docx_第3页
第3页 / 共11页
功能点算法及在软件测试中的应用Word格式.docx_第4页
第4页 / 共11页
功能点算法及在软件测试中的应用Word格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

功能点算法及在软件测试中的应用Word格式.docx

《功能点算法及在软件测试中的应用Word格式.docx》由会员分享,可在线阅读,更多相关《功能点算法及在软件测试中的应用Word格式.docx(11页珍藏版)》请在冰豆网上搜索。

功能点算法及在软件测试中的应用Word格式.docx

  关于MVC的更多详细说明请参考维基百科。

  接下来我们介绍MkII功能点算法,淘宝测试选择MkII的主要原因是,它的算法和MVC模式非常的吻合,可以说是黄金搭档。

  MkII功能点算法是这样:

先要给各个功能模块划分逻辑事务,然后针对每个逻辑事务,分析输入DET(DataElementType)和输出DET的数量,以及关联的实体类型数量,再根据一个算法公式,计算出功能点指数:

  功能点=输入DET×

0.58+实体类型×

1.66+输出DET×

0.26

  逻辑事务指用户在WEB应用程序中的原子操作。

很多开发团队都会设计UseCase,一般来说一个UC对应一个逻辑事务。

注意:

逻辑事务一定是记录用户行为的,而不是程序内部的处理逻辑。

不过在实际的分析中,我们发现逻辑事务的个数,往往要大于UC的个数,这是正常的,主要因为很多UC包含的信息很多。

  我们用淘宝的“购买商品”来举例说明怎么划分逻辑事务,先来看购买商品的页面:

  在这个页面中,左边一块是显示商品的简要信息,这是一个逻辑事务:

“查看商品信息”,右边最上面一个收货地址的radiobutton,也是一个:

“展示我所有的收货地址”,右边下面一组文本输入框加一个按钮,是一个:

“为当前商品创建一个订单”。

  在MVC中,逻辑事务对应Controller,每个逻辑事务都可以在Controller里面找到一个public函数。

  再讲一下输入DET和输出DET。

比如刚才的“为当前商品创建一个订单”这个事务,页面上输入信息的控件,都是输入DET,比如文本框、按钮,都是输入DET。

这个事务大约有10个输入DET:

“收货地址”、“购买数量”、“运送方式”等等。

输出DET指应用程序给用户提供的所有的提示信息,以文字提示的方式知会用户。

比如“购买成功”、“您没有绑定支付宝,不能购买”、“商品库存不足,无法购买”、“购买数量必须输入整数”等等。

这个事务的输出DET数量大约是20个。

  在MVC中,输入DET和输出DET对应View。

每个输入DET和输出DET都能在View中找到对应控件。

  最后讲引用实体,在创建订单事务里,引用的实体有很多。

订单成功后要扣减商品库存,因此商品算1个;

订单本身是1个;

订单需要同步生成支付宝交易,支付宝算1个;

还有物流记录算1个,等等,大约是5个实体以上。

  在MVC中,引用实体对应Model。

  到此为止这个逻辑事务的数据收集完整,代入公式计算得出结果:

  10×

0.58+5×

1.66+20×

0.26=19.3

  当然这只是一个DEMO,数字都是估算的,实际情况肯定比这个要复杂,算出的功能点指数就会多一些。

需要注意的是,使用MkII算法计算出的功能点指数,只是一个数值,代表应用程序的功能规模,和我们平时听到开发说的“我修改了一个功能点”,概念上是不同的。

所以我们用“功能点指数”这个概念,不过为了沟通起来方便,还是简化成“功能点”了。

  MkII功能点算法是非常适合于淘宝这样的互联网公司的。

不过由于WEB应用程序的交互日趋复杂,JS被大量使用,因此在实践中,如何划分逻辑事务,如何统计输入输出,还需要进一步的研究。

  随着淘宝网站的高速发展,淘宝开发团队规模也不断增大,于是必然要面对管理问题。

人数的增多必然带来管理层级的增多,这样很容易出现管理结构的臃肿,管理成本增高。

如果我们引入一种简单而且科学的工作度量模型,让每个人每个团队的工作质量和效率用数字来说话,便可以促进管理结构的扁平,简化管理过程,每个管理者可以管理更多的人,并且对下属的工作了如指掌。

  首先我们讲一下MVC模型,这是目前WEB开发的一种非常流行的软件架构模式。

View负责实现界面的设计,我们浏览网页看到的WEB界面控件,比如按钮、文本框、GRID都是在View中定义的,设计View主要是用Html和JS。

用户在View层进行的各种操作(比如点击按钮),就会启动Controller里的函数,主要的业务逻辑代码,都写在Controller里了,其实也就是对各种Model进行增删改查,比如购买一个商品。

——划分逻辑事务

  在前一篇文章我们讲到,“逻辑事务”是统计功能点指数的最小单元,所以进行科学的划分,对统计的正确性非常重要。

另外,划分逻辑事务其实也是一个需求分解的过程,测试工程师可以通过这个过程来分析项目需求,让需求分析工作更加标准化,同时也降低沟通成本,大家围绕逻辑事务进行讨论。

  逻辑事务一般描述的是用户的行为,所以命名一般都是动宾结构,例如“注册淘宝会员”、“查看宝贝的详情”。

也有少数的逻辑事务是由一些定时程序产生的,例如“同步用户的最新信息”。

有的项目会在需求文档里面专门描述一些“业务规则”,注意,规则不是逻辑事务,规则一定是依附与某个逻辑事务的,例如“不准注册同名的会员”这个规则其实是属于“注册会员”这个逻辑事务。

  在以数据库为基础的WEB应用中,逻辑事务一定是对某项数据进行的增删改查操作,也就是我们常说的CRUDL的其中之一。

CRUDL分别代表:

  ●Create创建新数据(注册会员)

  ●Read读取数据的信息(查看宝贝)

  ●Update更新数据(保存收货地址)

  ●Delete删除数据(清空购物车)

  ●List列出一批数据(各种DataGrid)

  下面我们对这5种逻辑事务分别进行分析,并且结合具体的案例来看看划分的规则。

如果逻辑事务划分正确,后面的计算出现误差就不会太大。

  Create

  每个WEB应用程序,都是从创建数据开始的,比如“发布新宝贝”、“注册新会员”,创建数据会在数据表中新增记录。

创建数据一般由用户在页面上点击按钮触发,也可能是在请求一个URL的时候触发。

  有时候,用户在一个页面点击“新建”,会同时新建两个数据对象,比如注册淘宝会员,会同时创建一个支付宝帐号,这里不能算做2个逻辑事务,而只有1个,这个逻辑事务的“实体”是2个。

  Read

  读取数据的逻辑事务基本都叫“查看XXX的详情”,WEB程序会根据主键,把某个数据对象select出来,把各个字段的值显示在页面上。

在分析Read类逻辑事务时,要对页面进行分块分类,因为现在很多WEB页面,都不是单纯显示一个数据,而是用i_f_r_a_m_e的方式,把相关对象都显示出来,这里每个对象都是一个独立的逻辑事务。

  注意,在一些列表页面,比如“我购买过的商品”,是用数据列表的方式,展示出很多商品,这不属于Read类逻辑事务,而是属于List,后面会讲到。

Read类一般都是展示单体。

  有些Read类逻辑事务会出现,不同身份的用户查看同一数据对象时,有不同的输出,比如VIP用户查看商品时有价格优惠。

这里不能算作2个逻辑事务:

“普通用户查看商品”“VIP查看商品”,而应该算1个。

“用户的角色”只是一个输入DET。

不过,如果普通用户和VIP用户查看商品,完全是两个不同的页面(View不同),那就要算2个逻辑事务了。

  Update

  这类逻辑事务是对已经存在的数据进行更新,一般叫做“保存XXX信息”,不过在某些场景,Update逻辑事务有很多其他的命名,例如“为订单付款”,实际上是更新了订单对象的状态,因此归于Update类。

  在一些信息的保存页面,例如“保存我的收货地址”页面,用户需要先打开某个收货地址的详情页面,然后再进行保存,那么这个详情页面,要算作一个Read类逻辑事务,用户点击按钮保存,算作一个Update类逻辑事务。

  Delete

  删除类逻辑事务出现的不多,一般都是用户点击“删除”按钮,把一个或者几个数据对象删除。

老规矩,如果用户一次点击,删除一个对象的同时,又级联删除了这个对象相关的另一个对象的话,只算作一个逻辑事务,实体是2个。

删除时一般都会弹出一个对话框,让用户确认,这个确认不算逻辑事务。

  List

  此类逻辑事务最常出现的形态是DataGrid数据表格,例如上文说的“列出我购买过的商品”。

这个控件在WEB应用程序中被使用的非常多,它用一种格式在一个页面展示出多个数据对象,并且把这些对象的关键属性(名称、类型)显示出来。

除了DataGrid,树型控件也是一个List类的逻辑事务。

此外,页面中展示对象的下拉菜单、RadioButton,也要作为单独的逻辑事务来计算,不过前提示,它们显示的是数据对象,如果是“男/女”这样的RadioButton,不是逻辑事务,而购买商品时,选择的“收货地址列表”则是逻辑事务。

  有一些DataGrid控件,支持用户直接在表格里修改数据,这里的修改功能要单独作为Update类逻辑事务计算,与上文有一点不同的是,不需要另算Read类逻辑事务了。

  到这里我们对这5类逻辑事务都分析清楚了,大家划分逻辑事务时,还要明确一个原则,每个逻辑事务的实体个数、输入DET个数、输出DET个数都不能是0,否则就不算逻辑事务。

例如,有的页面上设计一个按钮,用户点击后,跳转到另一个页面,这种单纯的跳转,不是逻辑事务。

逻辑事务都是对数据对象的操作。

大部分情况下,数据对象都在数据库中,也有一些情况,数据对象是文件对象,比如上传图片,图片本身就是实体对象。

  以上所列出的,都是常见的逻辑事务案例,在真实项目中,还可能会遇到一些其他的情况,大家只要根据逻辑事务的判定原则,进行推理,就可以很好的把逻辑事务划分清楚了。

  最后,要说一下测试用例设计。

非常相似的,测试用例也是围绕逻辑事务来设计的。

在组织用例分类时,基本遵循“项目-功能模块-逻辑事务”这种目录结构。

每个逻辑事务的用例,都拥有类似的前置条件、操作步骤、校验方法,所以组织在一起设计,是非常科学的。

——计算逻辑事务的实体、输入DET、输出DET

  前一篇文章(Part2)介绍了如何划分逻辑事务,文章发表后,大家提出了很多非常好的问题,我这里先简单回复一下,作为我们Part3的引子。

  Q:

逻辑事务分解对于那种“增删改查”类型的功能点比较适用,但是流程类的功能点,就不合适了吧?

  A:

就拿交易流程来说好了,我们在设计交易流程的TC时,是把下单、付款、发货、确认等操作,分别进行设计的,这些操作,其实都是单独的逻辑事务,实际上,开发在设计程序的时候,也是分开做的,不可能全写在一个函数里面。

我发现有的逻辑事务,比如点击一个按钮以后,程序既做了查,又做了改,按照你Part2里的分类,是不是应该算两个逻辑事务。

这个怪我没说清楚,这应该是算一个逻辑事务,他可以同时包含多个CRUD的action。

我们以前设计TC很多都是基于一个页面的,现在按照这种方式,一个页面会分解成多个逻辑事务,这样感觉会比较零散。

测试设计和测试执行是有区别的,测试设计的目标是把被测系统分析清楚,并不是编写出完整的执行脚本,实际上在测试执行过程中,有经验的测试工程师是会把几个逻辑事务放在一起测,效率极高。

  好,问题先讨论到这里,下面我们开始正题,如何计算每个逻辑事务的实体、输入和输出。

这篇文章我们仍然会分别对CRUDL这五类逻辑事务进行分析,因为他们的输入和输出的特点,各有不同。

不过,对于“实体”的计算,各类逻辑事务的计算方法相同,所以先单独讲一下实体。

  淘宝系统里存在下面这些实体:

会员、宝贝、交易记录、宝贝类目、评价记录、店铺等等。

实体的英文原名是EntityType,也就是我们平时讨论中经常出现的“对象”,经常接触代码的工程师会在代码里发现很多“xxxDO”,比如UserDO、OrderDO,这些和实体是完全对应的。

另外还有一个简单的办法来识别实体,就是看数据库的表,一般一个实体肯定至少对应一张表,比如会员这个实体在数据库里,必然有一张users表。

  分析一个逻辑事务有哪些实体,是分析的第一步,也是最重要的一步。

实体越多,开发和测试的复杂度越高。

从MkII算法里也能看出,实体的系数是1.66,远高于输入和输出。

另外,分析实体可以帮助测试工程师搞清楚,这个事务的范围,对事务有一个全局的概念。

分析完后,测试工程师一般会这么说:

“哦,这个事务跟这几个对象有关!

”在新人学习和测试设计评审中,实体的分析也能起到非常大的帮助作用。

  下面开始分类讲CRUDL的输入和输出:

  注册会员、发布新宝贝,这都属于Create类型逻辑事务,这类事务一般都有一个内容较多的“表单”,里面有一些输入框、checkbox、radiobutton和一个确认提交按钮,这里的每个控件,都要计算为1个输入DET。

需要注意,radio控件一般会有多个选项,不能算多个输入,而只能算一个;

提交按钮也要算1个输入。

除了这些页面控件类输入,还有一类输入,是“隐含”的。

比如卖家在发布新宝贝时,卖家自己的userid就是一个输入,因为在发布成功后,这个宝贝会拥有卖家的userid,只是这个id并不需要卖家填写,而是放在系统缓存里。

虽然是隐含输入,却也参与了逻辑运算,因此要计数。

这是Create的两类输入。

  Create事务的输出一般会有以下一些信息,“注册成功”、“此会员名已被人注册”、“密码太短”。

当用户试图执行这个事务,系统给用户所有可能的提示信息,都要记为一个输出。

有些输出跟某个输入,有直接的逻辑关系,比如“此会员名已被人注册”只跟“会员名”输入框里所填的信息有关,有的输出,则是由好几个输入组合在一起,才能出现,分析的时候,需要弄明白,不过这点区别不影响计数。

  如果把逻辑事务看成一个“函数”,那么输入就可以抽象为函数的输入参数,而输出就是函数的所有可能性的返回值,以及函数抛出的各种异常。

后面几类逻辑事务,也可以抽象为这种定义,大家后面自己推理试一试。

  Read类事务是读取一个对象的详细信息,比如我们查看一个宝贝的详细信息。

它的输入个数一般比较少,其中最基本的,就是这个对象的主键id,比如宝贝的id。

如果不同类型的用户查看宝贝时,会有不同的显示信息,那么用户的userid和用户类型这2个要记为输入。

如果宝贝的某些属性会影响显示,比如鞋城宝贝会有个图标,那么输入也要+1。

其实如果业务逻辑复杂,输入也不少。

我们可以把这些输入抽象的称为“影响对象显示的一些属性”。

  一般来说Read的输出都比较多,这个对象能显示在页面上的属性,都要记为输出,比如“宝贝名称”、“价格”、“颜色”等等。

除了文字类,图片也是输出,比如宝贝的缩略图和表示宝贝属性的一些小图标,都算。

另外,有的图片和Label有链接,这里的链接要单独算输出,因为一个纯文本,肯定没有一个附带http链接的文本信息量多。

Update

  Update事务的输入和输出数量可多可少,关键看系统Update的规模,比如“编辑宝贝”跟“发布新宝贝”相比,输入输出的数量都非常多。

像“修改我的登录密码”这样的,数量就非常少了。

Update事务的输入输出识别,与Create类非常相似,因为大部分Update事务也是表单提交的方式。

  这里需要注意的是,系统中会存在一些“不起眼”的Update事务,分析时千万别漏了。

比如大部分会员有多个收货地址,然后在列表中有一个鼠标悬停出现的“设置为默认收获地址”的按钮,当用户点击的时候,只是修改收获地址的一个属性,非常的隐蔽。

这也是一个逻辑事务,它的输入是用户id,收货地址id,输出只有1个,就是点击按钮后,系统提示修改成功,非常简单,但是不要遗漏。

  Delete类事务的分析相对简单一些,多数删除功能,都是直接对数据进行删除,因此输入一般就是数据主键id这1个。

不过,有一些数据在删除前,需要先做一些逻辑判断,看看能不能删,这样输入就多了,相应的实体也会增加。

比如,“已经发布的宝贝不能删除”,那么“宝贝发布状态”就是1个输入,“已经有交易的宝贝不能删除”,那么实体就不仅仅是宝贝,还有交易记录,输入也要增加“交易记录id”;

如果规则更复杂“有未完成交易的宝贝不能被删除”,那么输入还要增加“交易状态”,依此类推。

  List事务是一个重点,最后讲,它的输入输出计算比较复杂,而且多变,所以大家不仅要理解我下面讲的东西,还要能自己推理,分析自己实际遇到的各种List。

List事务实质上跟Read很像,不同在于Read只看1个对象,List要看多个。

首先看最常出现的List事务:

DataGrid,这种控件一般是一个二维表格,它的输入与Read类似,比如我的订单列表的输入是会员userid,我的已买到订单列表还要增加订单类型这个输入,我的近3个月已买到订单再加订单时间,等等。

有些列表上方,会有查询功能,比如按照名称查询,这些查询项会影响列表的显示数据,因此是输入。

大家如果想象一下这个列表对应的sql语句,就好理解了,where后面跟的都是输入。

  DataGrid里的输出比较直观,每一列就是一个输出,对应sql语句里的select后面的字段,注意,有些列显示的不仅仅是文字,还有图片,颜色,这些都要单独计数。

  对于DataGrid来说最纠结的要属“翻页”和“排序”功能,这究竟是算输入还是输出呢?

经过推理我们发现,翻页功能对显示的数据是有影响的,比如我翻到第二页(假设每页10个数据对象),很多程序会控制从数据库里读取的数据,只取出第11到20的数据,也是在sql的where后面加条件,所以,翻页属于输入的计数,流行的翻页一般是“上一页”“下一页”这样的按钮或者是直接输入数字翻页,只要出现1种,输入+2,要是两种都有,+4。

再说说排序,排序对应的sql标记是orderby,不是select也不是where

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1