Chinaunix首页 | 论坛 | 博客
  • 博客访问: 591055
  • 博文数量: 718
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-17 13:24
文章分类

全部博文(718)

文章存档

2011年(1)

2008年(717)

我的朋友

分类:

2008-10-17 13:28:03

  JUnit 假定测试的所有方面都是开发人员的地盘,而集成测试框架(FIT)在编写需求的业务客户和实现需求的开发人员之间做了协作方面的试验。这是否意味着 FIT 和 JUnit 是竞争关系呢?绝对不是!代码质量完美主义者 Andrew Glover 介绍了如何把 FIT 和 JUnit 两者最好的地方结合在一起,实现更好的团队工作和有效的端到端测试。

  在软件开发的生命周期中,每个人都对质量负有责任。理想情况下,开发人员在开发周期中,用像 Junit 和 TestNG 这样的测试工具保证早期质量,而质量保证团队用功能性系统测试在周期末端跟进,使用像 Selenium 这样的工具。但是即使拥有优秀的质量保证,有些应用程序在交付的时候仍然被认为是质量低下的。为什么呢?因为它们并没有做它们应当做的事。

  在客户、(编写应用程序需求的)业务部门和(实现需求的)开发团队之间的沟通错误,通常是摩擦的原因,有时还是开发项目彻底失败的常见原因。幸运的是,存在一些方法可以帮助需求作者和实现者之间尽早 沟通。

  

  集成测试框架 (FIT)是一个测试平台,可以帮助需求编写人员和把需求变成可执行代码的人员之间的沟通。使用 FIT,需求被做成表格模型,充当开发人员编写的测试的数据模型。表格本身充当输入和测试的预期输出。

  图 1 显示了用 FIT 创建的结构化模型。第一行是测试名称,下一行的三列是与输入(value1value2)和预期结果(trend())有关的标题。


  

  好消息是,对于编程没有经验的人也能编写这个表格。FIT 的设计目的就是让消费者或业务团队在开发周期中,尽早与实现他们想法的开发人员协作。创建应用程序需求的简单表格式模型,可以让每个人清楚地看出代码和需求是否是一致的。

  清单 1 是与图 1 的数据模型对应的 FIT 代码。不要太多地担心细节 —— 只要注意代码有多么简单,而且代码中没有包含验证逻辑(例如,断言等)。可能还会注意到一些与表 1 中的内容匹配的变量和方法名称;关于这方面的内容后面介绍。


  


package test.com.acme.fit.impl;

import com.acme.sedlp.trend.Trender;
import fit.ColumnFixture;

public class TrendIndicator extends ColumnFixture {

  public double value1;
  public double value2;

  public String trend(){		
    return Trender.determineTrend(value1, value2).getName();
  }
}

  清单 1 中的代码由研究上面表格并插入适当代码的开发人员编写。最后,把所有东西合在一起,FIT 框架读取表 1 的数据,调用对应的代码,并确定结果。



  

  FIT 的优美之处在于,它让组织的消费者或业务端能够尽早参与测试过程(例如,在开发期间)。JUnit 的力量在于编码过程中的单元测试,而 FIT 是更高层次的测试工具,用来判断规划的需求实现的正确性。

  例如,虽然 JUnit 擅长验证两个 Money 对象的合计与它们的两个值的合计相同,但 FIT 可以验证总的订单价格是其中商品的价格减去任何相关折扣之后的合计。区别虽然细微,但的确重大!在 JUnit 示例中,要处理具体的对象(或者需求的实现),但是使用 FIT 时要处理的是高级的业务过程。 

  这很有意义,因为编写需求的人通常不太考虑 Money 对象 —— 实际上,他们可能根本不知道这类东西的存在!但是,他们确实要考虑,当商品被添加到订单时,总的订单价格应当是商品的价格减去所有折扣。

  FIT 和 JUnit 之间绝不是竞争关系,它们是保证代码质量的好搭档,正如在后面的 案例研究 中将要看到的。



  

  表格是 FIT 的核心。有几种不同类型的表格(用于不同的业务场景),FIT 用户可以用不同的格式编写表格。用 HTML 编写表格甚至用 Microsoft Excel 编写都是可以的,如图 2 所示:


  

  也有可能用 Microsoft Word 这样的工具编写表格,然后用 HTML 格式保存,如图 3 所示:


  

  开发人员编写的用来执行表格数据的代码叫作装备(fixture)。要创建一个装备类型,必须扩展对应的 FIT 装备,它映射到对应的表。如前所述,不同类型的表映射到不同的业务场景。


  

  最简单的表和装备组合,也是 FIT 中最常用的,是一个简单的列表格,其中的列映射到预期过程的输入和输出。对应的装备类型是 ColumnFixture

  如果再次查看 清单 1,将注意到 TrendIndicator 类扩展了 ColumnFixture,而且也与图 3 对应。请注意在图 3 中,第一行的名称匹配完全限定名称(test.com.acme.fit.impl.TrendIndicator)。下一行有三列。头两个单元格的值匹配 TrendIndicator 类的 public 实例成员(value1value2),最后一个单元格的值只匹配 TrendIndicator 中的方法(trend)。

  现在来看清单 1 中的 trend 方法。它返回一个 String 值。可以猜测得到,对于表中每个剩下的行,FIT 都会替换值并比较结果。在这个示例中,有三个 “数据” 行,所以 FIT 运行 TrendIndicator 装备三次。第一次,value1 被设置成 84.0,value2 设置成 71.2。然后 FIT 调用 trend 方法,并把从方法得到的值与表中的值比较,应当是 “decreasing”。

  通过这种方式,FIT 用装备代码测试 Trender 类,每次 FIT 执行 trend 方法时,都执行类的 determineTrend 方法。当代码测试完成时,FIT 生成如图 4 所示的报告:


  

[1]   

【责编:wayen】

--------------------next---------------------

阅读(429) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~