简化合同测试

发表于:2014-7-29 09:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:王平平    来源:51Testing软件测试网原创

  合同测试-对在文档中承诺实现的具体的接口和行为的测试,是一种对项目验证至关重要的测试,但是这种测试在扩展多种接口的Java类上很难实现。
  接口分离法则中,作为可靠的编程法则的一个法则,阐述的观点是客户不应当依赖不使用的接口。也就是说,大的接口应当做到足够小,那样客户才会在实际中使用到这些接口。接口分离法则因此暗示了一层意思:一个应用程序应当有多个小的接口组合在一起来创建更复杂的对象。合同测试认为一个应用程序或者组件的正确性可以通过生产单元测试来保证,也称作隔离对象测试,它通过验证接口的实现情况来确保接口没有违背接口合同对接口的约定。已经有数篇文章在讨论这种测试的优势在哪里;然而,我没有发现任何一篇文章去讲怎样测试合同在几个接口组合到一个单一对象的情况下的实现情况。
  合同测试检查由JAVA接口和其相关联的文档所定义的合同的实现结果。这个接口定义方法签名,同时文档经常将这种定义扩展到具体定义该接口预期的表现行为。举个例子来说,Map接口定义了put()方法,get()方法和remove()方法。但是可读的文档告诉开发人员如果你要放置一个对象,就必须能够获取它除非调用了移除方法。最后的那句话定义了该合同的两个测试。
  另一个例子可以在Apache Jena Graph接口里找到,这个接口有一个加法(三倍)的方法。从这个接口上,明显可以看得出这个方法是给该图添加三倍的值。不明确的是在添加三倍的量之后,该图必须报告该加法结果给所有的注册收听者。这个图表合同测试验证了这个行为会发生。
  一个更极端的例子是java.io.Serializable, 这个接口中没有方法需要测试只有文档告诉我们说所有的序列对象必须只能包含序列对象或者实现三个有很具体签名的私有方法(只有两个方法是在java1.4之前出现)。除此之外,所有从Serializable类衍生的类本身也要是序列化的。去看Serializable javadoc找细节。(一个序列化接口的合同测试的例子,在junit合同样例中有提供)。对合同测试的使用的基本诉求是他们可以帮助证明代码的正确性。也就是说,如果每个对象接口被定义为一个接口,而每个接口有一个涵盖所有方法及其预期操作的合同测试,那么所有的对象按照接口的定义来看就有模仿其调用的对象的测试,然后运行整个测试套显示对象之间的链接是正常工作并且正确的。
     ......
 查看全文请点击下载:http://www.51testing.com/html/42/n-863942.html
  问题
  在最基本的层面上,合同测试说如果你有一个接口A, 应当有一个测试AT测试该接口规定的合同。举例来说,在Apache Jena 项目中,有一个接口模型,它有一个方法createResource()。除了返回该资源,执行方法必须确保如果getModel()方法在返回的资源上被调用,创建该资源的模型会被返回。模型合同测是将会执行该测试任务。
  因为A是一个接口,AT必须能够测试任何A的实例;因此,它必须是一个有着抽象方法的类,这个抽象的方法能够获取A在测试过程中的执行结果或者它是一个具体的有设置器,有能够设置在测试中的A的执行结果的设置器的类。
  对这个简述的解决方案,假设ATimpl是测试下的A的具体实现结果,ATimpl是AT的具体实现结果。ATimpl是一个比较简单的类,它扩展AT,并且执行抽象的获取或者设置操作。至此,事情变得清晰起来了。然而,与类不同,多个接口可能被一个类执行或者为另一个接口所扩展。这使我们得出一个结论,即一个用例中若有多个抽象测试就必须把这些抽象测试组合起来创建一个完全的合同测试。
     ......
 查看全文请点击下载:http://www.51testing.com/html/42/n-863942.html

 版权声明:51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

《2023软件测试行业现状调查报告》独家发布~

精彩评论

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号