??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产片在线观看,亚洲色偷偷偷综合网,亚洲w码欧洲s码免费http://m.tkk7.com/alex/category/13522.html不求多得,只求一? about java,hibernate,spring,design,database,linux,etc. <br/><br/> 最q关心的内容关键?web快速开发方案,建模,workshop studio,Ajax zh-cnTue, 27 Feb 2007 08:39:39 GMTTue, 27 Feb 2007 08:39:39 GMT60[转]学习(fn)如何利用FitNesse解决开发质量方面的问题http://m.tkk7.com/alex/archive/2006/07/28/60525.htmlAlexAlexFri, 28 Jul 2006 03:43:00 GMThttp://m.tkk7.com/alex/archive/2006/07/28/60525.htmlhttp://m.tkk7.com/alex/comments/60525.htmlhttp://m.tkk7.com/alex/archive/2006/07/28/60525.html#Feedback0http://m.tkk7.com/alex/comments/commentRss/60525.htmlhttp://m.tkk7.com/alex/services/trackbacks/60525.html
key words: 真正的测试先行开?试驱动 Fitnesse


摘要
本文描述了如何用开源的FitNesse来实现真正的试先行开发过E,q让客户、需求提报工E师、开发h员、以?qing)测试h员进行协同工作,辑ֈ需求更_և、减需求更攏V测试数据与Junit单元试代码分离的目的,让这一切更z、更易于l护?br />作者:(x)Stephan Wiesner
译者:(x)陈v?joson)

在过ȝ几年里,我在开发测试工作中担Qq各U角Ԍ使用q服务器端的JavaScriptQPerlQPHPQStrutsQSwing以及(qing)模型驱动架构{各cL术。尽项目不同,但是他们有一些共同点Q项目结束的旉晚Q就难以达到客L(fng)真正需求?br />每个目都有一些需求,有的非常详细Q有的却只有几页U,q些需求一般要l历以下三个阶段Q?br />---由客h者承包h来书写或采纳一些官方的验收标准
---试者试图根据需求来扑և软g中不W合要求的地?
---目开发完毕进入验收测? 可是客户H然又提出对软g需求进行补充或变更的要?br />
最后一个阶D将D目发生变化Q开发期甚至要超出最后期限,使开发h员的工作压力剧增Q从而导致发生更多的错误。Bug的数量将快速增长,pȝ的质量将下降。听上去是不是很熟?zhn)Q?br />
? 在让我们看一下在上述的项目开发中发生了哪些错误:(x)客户、开发、测试h员没能协同工作;需求已l确认通过Q但是在不同位置的h可能q用不同的需要未考虑? 另外Q开发者一般会(x)写一些自动测试代码,试人员也试图进行自动化试Q但是他们往往不能充分协同Q许多项目被重复试Q但另一些(l常是更困难的部分) 却没能被试Q客户也没参与到试工作中。本文所介绍的就是通过自动试与项目需求相l合的方式来解决q些问题的一U方案?br />
版权声明QQ何获得Matrix授权的网站,转蝲时请务必保留以下作者信息和链接
作?Stephan Wiesner ;joson(作者的blog:http://blog.matrix.org.cn/page/joson)
原文:http://www.javaworld.com/javaworld/jw-02-2006/jw-0220-fitnesse.html
Matrix:http://www.matrix.org.cn/resource/article/44/44507_FitNesse.html
关键?FitNesse;Test

开始FitNesse

FitNesse 是一个增加了可触发Junit 试{附加功能的wikiE序。如果这些测试能够与业务需求结合v来,׃(x)使业务需求更加清晰。而且Q测试数据的l织更有逻辑性。用FitNesse? 重要的是学习(fn)隐含在其中的一些思想Q某些部分需求可以作为测试的一部分Q这意味着Q这些需求是可以试的,或者说是可以进行校验的?br />
利用 FitNesseQ开发的工作q程可以q样描述Q需求工E师使用FitNesse书写业务需求(取代了一般文档)。他试图可能让客户参与其中Q当然这q? 不是每天都能做到的。而测试者在反复研究q些文档Qƈ从第一天v开始提问各U问题,因ؓ(f)他们考虑问题的方式不同,不是在考虑“Y件应该实C什么”?? 是在考虑“怎样才能让Y件出错?如何让Y件中断运行?”等。开发者更象一个需求工E师Q他更想知道“Y件必要完成它的功能是什么”?

试人员可以更早地开始测试,甚至在需求没有全部完成前Q而且可以把测试写q业务需求中Q这些测试不仅仅成ؓ(f)需求的一部分Q而且也将成ؓ(f)需求评审和验收的重要过E,q具有以下几斚w的重要优点:(x)

---客户也会(x)被吸引来开始考虑关于试的事情,通常他们q会(x)参与到徏立测试的工作中来Q你也许?x)吃惊,他们怎么对这些这么感兴趣了。)
---相关规范?yu)更详细、更周密Q因为测试L单纯的文字要准确.
---通过q种方式Q可以更清晰明确C解YӞ象一个Y件原形,但是功能更多Q?因此可以更早地考虑真实的运行场景,提供试数据和测结果?

最后,需求将提交l开发h员,他的工作要比以前要更Ҏ(gu)些,因ؓ(f)需求都附带具体的实例,因而更贴近实际需求,因此减少了被H然改变的机?x)。下面,p我们看一下这个过E是如何使开发者工作更L的吧?br />
试先行的实?/span>

? 常情况下Q测试先行开发中最困难的是没h愿意p那么多的旉来写试Q而更愿意去考虑如何让Y件工作v来。按照上q的q程Q开发者把功能试看作合同? 一部分Q他的Q务要从“按要求~程Q检ƈ修改”{变ؓ(f)“让试q行h”。现在,在确定应该做什么,何时完成Q项目的定位{方面,我们有了更好的方法?br />
q所有的试都可以自动进行,q所有的部分都可q行单元试。我们通常测试划分ؓ(f)以下几种cdQ?br />---数据驱动的测试,需要通过单元试来完成,如计就是一U典型的例子.
---关键字驱?(Keyword-driven) 试Q常自动化进行。这是一些系l测试,要求应用E序能够q行Q按钮能够被点击Q数据可以被键入Q而输出的l果中包含规定的倹{测试团队一般都能实现这U测试,但是可能开发者更Ҏ(gu)完成q些工作?br />---手工试。这cL试适用于或者实现自动化试的代价太昂贵q且是对出错的要求不高的情况Q或者是一些基功能Q如Qv始页面不能显C)Q可以很Ҏ(gu)地发现错误的情况?br />
我是?004q首ơ接触FitNesse,我曾l嘲W过它ƈ扬言它是不可能工作的。把试写入wikiq自动进行测试,q个L看v来太荒唐。但是,我错了,FitNesse真的象看h得那L(fng)单高效?br />
FitNesse的简单是从安装时开始体CQ只要完全下载了FitNesse的发行包Qƈ解压~就可以了。在以下的讨Z假设解压Cc:\fitnesse目录中?br />
q? 行C:\fitnesse 下的run.bat(linux 下运行run.sh)来启动FitNesseQFitNesse作ؓ(f)一个web服务q行?0端口上,当然你可以指定端口,如设?1Q在q行脚本的首? 加上 –p 81 卛_Q这是讄的全部工作。现在你可以用http://locahost:81来访问你的FitNesse了?br />
在本文,我用windowsq_的java版F(tun)itNesse,当然Q这些例子也可以用于其它版本和其它^収ͼ如Python,.net{)

一些测?/span>

? 可以从FitNesse的在U文档提供了一些例子(可以与有名的Junit的货币用例相提ƈ论)开始做Pq些例子非常适合学习(fn)如何使用 FitNesseQ但是它们还不算是解军_杂问题的例子。因此,我将使用一些在我最q项目中的真实的用例。我已经化了问题、代码,而不是直接取自项? 中,q写了一些说明。尽如此,q些例子q是_复杂Q能够充分展CFitNessez直观的威力
现在Q假设我们正在从事一个ؓ(f)一个大型的保险公司开发开发项目,q是一个复杂的Zjava的企业应用。品将늛公司的全部业务,包括客户和合同管理,以及(qing)支付业务Q在我们的例子里Q我们只x其中的极的一部分?br />
在瑞士,父母有权利获得给每个孩子的儿童|_(d)l过认家庭环境后,根据情况得到相应的z脓(chung)。以下是q个需求的化版本,我们从一个传l的需求开始,q把它迁UdFitNesse中?br />
儿童z脓(chung)的发攑֭在几U状态。有xƾ规定在孩子出生月䆾的第一天开始生效,在孩子达到规定年龄、就业或M的所在月份的最后一天失效?br />
按规定在C12岁所在月份的W一天,可以领?90瑞士法郎Q瑞士官方货币)的补贴?br />Ҏ(gu)父母全职或兼职工作等情况Q依据不同的条款Q如?所C行分c?

image
?1. 儿童z脓(chung)资格?

׃率要Ҏ(gu)工作合同来计,合同需要被认是有效的Q如果有l止日期Q还要确认是否在“有效期”内。表2昄了根据孩子年龄的不同{条Ӟ父母可以得到的补贴数量?br />
image
?2. q龄相关条款

正常情况下,每两q要Ҏ(gu)进行有规律地调整?br />
W一ơ看到这些需求,也许?x)认些需求是很明的Q开发h员有能力L地实现它Q但是,我们真的定了这些边界条件了吗?该如何测试呢Q?br />
边界条g
边界条g是指辑ֈ、超q、低于某个给定的输入输出之的情况。经验表明,在边界条仉q的试比其他测试更有h(hun)?典型的例子就是著名的“只执行一ơ”的条g跌{和程序段.


场景对于查找例外条g和边界条件有很大帮助Q因是得到关于商业规则的行业l验的好Ҏ(gu)?br />
场景

? 大部分项目而言Q是由需求工E师来提供给开发h员的需求规D明书Q然后开始学?fn)了解需求,提问Q然后开始设计、编码、测试。再后来Q开发h员把软g提供 l测试团队,在经q几番改写和修补后,最后交付给客户Q客户也许更喜欢考虑提出一些意外的需求)。如果采用了FitNesse,不?x)改变这一q程Q只? 要增加一些测试用例、场景,和测试意ѝ?br />
场景在启动测试过E中h特别的的帮助。以下是一些例子,在回{将支付多少儿童z脓(chung){ؓ(f)题上Q就要分清多U情况:(x)
---玛丽亚是单亲家庭Q她又两个儿?(鲍勃, 2?  彼得 15? Q从事兼职秘书工?(每周工作20个小?.
---玛丽亚失业了Q后来她扑ֈ一个每周工?0个小时的商店助手和每周工?个小时的临时照顾q儿的工?
---保罗和拉瑞(LaraQ有一?7岁的奛_丽莎QLisaQ,Ҏ(gu)一个残疾hQ还有一个儿子弗兰克Q?8岁,q在上大学?br />即是仅谈论一下这些场景,也有助于试工作的开展,哪怕是软g中手工运行这些例子,也几乎可以确信会(x)发现E序的遗漏,N因ؓ(f)没有原型׃做这些吗Qؓ(f)什么不做呢Q?br />
关键字驱动(Keyword-drivenQ的试

? 键字驱动的测试常用于模拟原型QFirNesse允许定义关键字驱动的试cdQ详见“完全的数据驱动自动化测试”(“Totally Data-Driven Automated Testing”)Q甚臛_没有软g支持的情况下(不能自动q行)Q运行基于关键字驱动的测试也?x)很有好处?br />
image
?3. ActionFixture 试

? 展示的是关键自驱动测试的CZ。第一列描q的是来自FitNesse的关键字Q第二列描述的是javacȝҎ(gu)Q开发者根据这里的描述Q在JavaE序? 用这些名字来命名Q。第三列描述的是来自W二列的Ҏ(gu)所产生的数据。最后一行演CZ试p|的情形(试通过为绿Ԍ。正如你所看见的那P扑և错误是很 Ҏ(gu)的?br />
q会(x)使h很容易甚臛_乐意d立这些测试。测试者不必具备编E技能,l过短介l后Q客户也?x)很?gu)的读懂?br />用这U方法定义的试Q几乎就是业务需求,q具备传l测试用例没有的重要优势, 甚至不必去自动生成也有很多优?
---试内容很容易获得,不必特别训练?yu)可以轻村֮成?
---与其改变需求,C如先改变?gu)试Q这样反而更直观(q与使用某些工具的情况完全不?
---在确定新需求或修改需求时Q可以随时运行测试来看看需要修正哪些内宏V?br />
动运行测试,需要徏立一个简单的软g层,用于代表真实的测试代码。这些测试在自动化测试GUI操作时特别有用。我曑ּ发过一个基于HTTPUnit的自动测试web?br />
q里是FitNesse自动q行的代码:(x)
package stephanwiesner.javaworld;

import fit.ColumnFixture;

public class ChildAllowanceFixture extends ColumnFixture
{
   public void personButton() {
      System.out.println("pressing person button");
   }
   public void securityNumber(int number) {
      System.out.println("entering securityNumber " + number);
   }
   public int childAllowance() {
      System.out.println("calculating child allowance");
      return 190;  
   }
   [...]
  }


在FitNesse中的q行l果如图4所C,很有助于调试。与Junit相比QJunit抑制了调试信息的输出Q但我认为在自动Web试中这些输出绝Ҏ(gu)有必要的?br />
image
?4. 标准输出

在测试基于Web的应用时Q错误也被包含在FitNesse面里,q被昄出来Q这是的条施工作比用log文g更容易?br />
数据驱动的测?/span>

? 键字驱动的测试是GUI自动试的最佳选择Q同P数据驱动试也是各类计算c项的首选测试方式。如果你曄写过单元试Q那么测试中什么是最令h厌倦的 呢?也许Q你?x)认为是数据。你的测试要q行数据填充Q但是数据经常改变,使维护工作变成了可怕的恶梦Q测试不同的l合Q需要不同的数据Q这也许?x)你的? 试工作变得日益复杂,变成了”丑陋的怪兽”?br />
使用数据驱动的测试,数据从代码中分R一般情况下Q徏立几U类型的表格Q存储ؓ(f)CSV文gQ由试代码来读取。如果再使用FitNesse,我们可以更便利地进行存储、改变,以及(qing)讉Kq些试数据?br />
? 在,让我们把?U的表格转变成一个测试吧。首先,表格拷贝到Excel中,q行修改Q然后用FitNesse的EXCEL导入功能输入。这是一个有 用的功能Q因为在FitNesse中,表越大越难以l护。输入的l果如图5所C。每一行表CZ个测试,有问L(fng)列表C需要写JavaҎ(gu)Q没有问L(fng)行表 C入的试数据?br />
image
?5. 数据驱动试表Data-driven test table.

? 重复一ơ,在阅M业务需求后Q这U测试就非常Ҏ(gu)理解了。如果你曄担心如何在你的测试用例里的进行等值测试的话,那就看看q里吧。最后一行大概是最? 要的Q因为需求ƈ没有说明如何处理非法数据Q或者处?0岁以上的孩子但仍在上学等情况Q这里的关键字“error”表明需要处理异怺?br />
常见问题解答

q里讨论使用FitNesse在需求、测试和开发过E中遇到的未解决的问题的解决办法Q以下是部分{案?br />
手工试?x)遇C么问题?
? 工测试者最常做的就是重复的手工回归试Q不但代h贵,而且Ҏ(gu)出错。自动化试可以减少但不能消除这U工作的工作量。测试者可以有更多的时间去从事? 有趣的测?例如在应用程序在复杂的场景下的不同处理等Q尽测试就是要p更长的时间找到错误,但比不意味着因此而要付出更高的代?

用户验收试不再有必要了吗?
也许有h?x)这栯为。如果客户在需求中定义了所有的试Q当所有测试测试都变绿Q通过了)Ӟ软g“完工”了。我的实늻验是Q客户仍?x)提出附加的需求来Q尽如此,他们的需求变化会(x)更少Qƈ更容易地l合实际变化q行分类Q同时也?x)带来追加的NQ?br />
在FitNesse书写比Word documents更有优势吗?
甚至在没用测试的情况下,使用wiki 来写业务需求也能带l你更多好处。文档可以自动用在Web 服务器上Q可以被多hq发讉KQ可以全文检索,可以被链接。我发现q有以下两个特点Q?
---更容易徏立数据字典,q接上明细内容。更重要的是Q具有查找被引用位置Q?where-used"Q的功能?如果修改某个l目Q就?x)立x到是否被引用q,以避免发生冲H?
---׃Bugzilla (或?JiraQ二者均为缺陯t系l,译者注) 是基于Web? 我们可以方便地在两个pȝ之间互相链接文档(artifacts) (bugs, d, 讨论{?,便于提高工作效率?br />
FitNesse 允许按照定的顺序运行测试,而JUnit 止q样做,你有何体验?
? 用JUnit,需要对同一个对象分别徏立许多setUp() 和tearDown() Ҏ(gu). 在某些情况下Q可以在一个FitNesse面里放上所有的相关试Qƈ能够l定执行序. 因此Q第一个测试可以徏立一个”h”,下一个测试可以对它进行修改,最后一个可以进行删除操?如果W一个测试失败了Q而且那个”h”没有被建立Q这该? 么办Q没问题Q因为第一个测试失败了Q随意在把它修正好之前,我是不会(x)l箋? 我一般不?x)经怋用这U顺序执行方?但有时它?x)给我带来很大方?

FitNesse 可以用于大项目吗Q?
? 部分开发者会(x)明白QFitNesse的优势就是简单易用。但没有技术背景的人,如果不用自动检查特性以?qing)所见即所得风格的~辑器,工作h?x)很困难。一 个简单的例子是FitNesse 只有允许使用三种cd的标? 但现在我们需要五U,q就需要我们就可以对FitNesse q行扩充.

FitNesse 不包含输Zؓ(f)cMPDF文g的功能。我曄使用q长度达?0늚Word文档Q尽编辑v来有些困?但是可以L打印出来. 但是当我把它转到FitNesse里后,我就难以打印了,因ؓ(f)被分解ؓ(f)几个不同的页面,最后不得不通过~程解决.

FitNesse h一个简单的机制可以昄那些文档被修改了Q被谁修改了,但不能显CZ改了什? 权限理有局限。用FitNesse重开一个项目要比改写一个运行的目更容?对中型目而言Q我极力推荐FitNesse. 大项目也可以使用Q但是进行更仔细的评估后再实施会(x)更好.

l论
我认为FitNesse是需求分析的好工PҎ(gu)试优先开发很有帮助,它是很有利用价值的。我被迫p几个周来适应FitNesse?qing)其处理q程Q我的项目目前尚未完成,但是我已l看C需求质量和软g质量均得到明显提高,而对试者而言Q工作v来会(x)获得更多的乐??br />
关于作?/b>
Stephan Wiesner 是瑞士卢赛恩L&ouml;wenfels Partner AG的测试管理h员。他是“Learning Jakarta Struts 1.2?伽利略出版社Qd语版QISBNQ?898426130Q英语版QISBN: 190481154X)的作者,?Java der Code?由d国MITP出版C֏行,ISBN: 3826614623)。另外还在d文杂志上写过大量的与java相关的文章。他有着丰富的开发和试l验Q是一位ISTQB认证的测试管理员和认证的 ScrumȝQScrumMasterQScrum是一U敏捷开发方式,译者注Q?br />
陈v?joson)Q本文译者,生活在中国的׃省烟台市Q先后从事Y件开发、数据库理、系l管理等工作Q?001q获得高U程序员资格?br />
相关资源
---Matrix-Java和中间gC֌:http://www.matrix.org.cn
---“完全的数据驱动自动试”("Totally Data-Driven Automated Testing" Q,作者Keith Zambelich Q详l阐qC数据驱动和关键字驱动的测? http://www.sqa-test.com/w_paper1.html
---以下站点提供了更多的关于优化FitNesse的内? http://fitnesse.testmanager.info
---官方的FitNesse|站Q经常更? http://fitnesse.org/
---下在完整的FitNesse发行? http://fitnesse.org/FitNesse.DownLoad
---部分资料可以在译者的站点扑ֈ:http://www.chq.name/

作者的其他文章

其他相关文章



Alex 2006-07-28 11:43 发表评论
]]>
վ֩ģ壺 ҳƷ˿| Ʒһ| Ƶ߹ۿ| պavѲ| ҹҹAһ| Ѽվһҳ | 777ӰƬѹۿ| ۺɫ鶹| 99þֻƷ| 㽶߹ۿ| Ƭѿҹa| ŷ պ ۺ| Ʒ۲ӰԺ| Ƶվ| Ʒ޾Ʒպѷ| a߹ۿƵ| ɫͼƷ| Ƶվ| av͵߹ۿ| AҹƬƷվ | ƷһһƵ| 츾AVӰ| 99reȾƷƵ| պ޹ۺϸ| AV֮˵| aëƬëƬѹۿó| ޻ɫ߲| ձվ| ĻѹۿȫӰ| ۺɫ鶹| ѾþþƷ| òѸԴվ| Ļŷպ| ޵һɫַ| 96ѾƷƵ߹ۿ| AVƬվ| þþƷ㽶| ĻmvֻѸ| ˼˼þ99ѾƷ6| ëƬѹۿ| ŷ޾Ʒ˾þԻӰƬ|