网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  测试实践:eclipse 之 junit     
  文章作者:未知  文章来源:水木森林  
  查看:97次  录入:管理员--2007-11-17  
 
  这篇文章将给你介绍junit——一个工程测试调式的工具。 在介绍了了 测试驱动开发理论之后,我们继续介绍“怎样用eclipse创建你的、junit test”。 我们会用象"hello word"一样简单例子来向你揭露junit case。
  
  自动化测试(automated testing)在好多书籍中被介绍了,但很少注意讲怎样去组织这些测试。 当测试写的越多时,很难知道把这些测试放到哪或者用什么去调用它们。 在极限编程---extreme programming(xp),测试驱动开发 test-driven development (tdd)盛行的时代,这成了一个很大的问题。 你可以把 测试驱动开发(tdd)认为是"development through testing" 开发由经测试。
  
  tdd的主要条款:
  
  在任何代码片段之前,必须先写好自动检测这段代码功能的程序。既然代码不存在,那么测试在一开始就失败。
  
  在 测试通过之后,复制的代码必须删掉。
  
  象这样的方式每个程序员都可以应用,并不需要特定的方法论。但在我们开始写test之前, 值得我们注意的是,先考虑一下如何组织自动化测试。
  
  这里有几种我们需要考虑的测试
  
  单元测试(unit test) :这些是为检查个别模块(比如classes类)服务的。 如果对象需要访问外部的数据源,比如database,就需要通过一些模拟的对象(mock object)来模拟database, (但这也只有在真实环境的数据与测试环境不同的时候。
  比如测试环境里面没有真实datebase,就需要mock object)
  
  用户测试 (customer's test):这里是功能的,系统的并且认可的测试。系统中所有的行为检查都做为一个整体。 在xp理论中,这些测试,是由用户编写的,给出测试案例提纲。
  
  集成测试 (itegration tests): 这些测试象是在用户测试和单元测试之间的十字路口。 集成测试帮助程序测试几个级别中交互。 ,mock object不会出现在集承测试中,他会增加测试时间。同样,集成测试也经常需要存在的特定的测试环境,比如从数据库中放一些测试数据。集成测试也许使用外部的lib。 cactus就是这样一个j2ee集成的lib。 解释这些测试已经超出了本篇文章的范围,并且也需要详细的理论叙述,所以,你仅需要知道这种测试存在就可以了。
  
  开发测试(developer's test) : 这种测试就是那些开发者校验 整段代码,新加的代码,新加的函数函数。 对于每个开发而言, 随时生成新的的测试去检查代码是很重要的。 组织这些测试和组织这些代码有着同样的重要性。
  
  至于本文其他地方,只要说到"测试",就是专指开发测试(developer's test)。
  
  在开发期间, 一个程序员有时可能问自己:系统中这个行为有test么,这个test存在么,哪里可以找到这个test?每次发现错误,都是靠最基础修改bug而不是通过自动测试,这是一个典型的例子。 在这种情形下事情进展可能是:
  
  去找到这个函数的测试(可能测试已经写了,但里面还有一些小错误)
  如果这样的测试还没有,或者测试不能盖住这种错误,我们就写一个新的测试来盖住这种错误。
  现在 我们深信,程序在新的测试中不会通过。
  修复程序中的bug。
  再运行测试
  确定程序在测试中通过了。
  
  当然,可能出现各种各样的处理, 但思想必须很明确:你只需纠正那些被测试找出那些错误。
  
  现在,让我们告诉你一个开发人员怎样解决这种情形。 通过存在的功能性的测试
  
  我利用一些集成的开发环境(ide)来查找 被修正那些类和方法的放在什么地方。
  
  制造一个已知的错误环境,来查找那些代码判断存在错误。
  
  最后但不是最不重要的,写好测试并且放到一个现有的测试类中去。 如果你不小心出了错误, 期望你和你的同事能注意到副本,并且纠正它
  
  都准就绪,开始建立测试了, 所以现在需要给测试取一个名称。 你可能说,“这不是问题: 在每个类面前加个test就是了!” 但并不是那么简单的, 让我告诉你这样如果可能造成的问题:
  
  当时候我们在使用tdd的方式开发时, 需要测试的class或者method可能都不存在。
  
  也可能一个test 含盖了好几个方法,甚至好几个classes。
  
  这些仅仅是最普通的问题, 下面还有更多。
  
  给个在test命名上的建议: test 类的取名首先应该表达出这个类是一个test类,并且能确切的表示出他要检查哪些,留有这个原class名的味道。 其实这很容易,请别担心这个名称会变的很长或者很丑陋,自己随便怎样取都可以。
  
  下面我们将使用eclipse中的junit工具建立我们的第一个测试,假定你已经下载了这个产品的当前版本, 如果没有,你随时可以从它的官方网站(www.eclipse.org)下载。我们需要junit,你也可以从它的官方网站(www.junit.org)上下载,下载并解压缩到你硬盘中存放java libaries的地方。
  
  打开eclipse.我们将建立一个新的工程的工作空间(workplace project) 点 file -> new ->project,选择java一路next。 输入工程名称(project name),比如projectwithjunit. 点击完成。 这样就建立了一个新工程,让我们配置一下我们的eclipse,于是,我们把junit library 添加到build path. 点击 project-->properties, 选择java build path libraries, 点add exteranal jars 选中junit.jar。 你将会看到junit将会出现在的屏幕上 libraries列表中。 点okay,eclipse将强制rebuild所有的build paths.
  
  我们已经准备好,开始写我们的"hello world"了 . 让我们遵照tdd规范:在编码之前就建立测试。为了, 我们将假顶我们将要写的类名是helloworld 有一个返回字符串的方法 say().
  
  要建立这样一个test, 在projectwithjunit标题上右键, 选择new -> other,展开"java", 选择junit. 在对话框的右边一拦里选择testcase,接着点next. 参见图1。
  
  
 测试实践:eclipse 之 junit(图一)

  图1。 在eclipse 中建立junit test
  在test class:一拦里输入我们需要测试的class--helloworld。并且给test case取个名称--- 比如,testthatwegethelloworldprompt(是的,这看上去太长了,但是它能很清楚表达出它的意思) 点finish完成。
  
  下面是 testthatwegethelloworldprompt.java的代码:
  
  public class testthatwegethelloworldprompt
  
  extends testcase {
  
  public testthatwegethelloworldprompt(
  
  string name) {
  
  super(name);
  
  }
  
  public void testsay() {
  
  helloworld hi = new helloworld();
  
  assertequals("hello world!", hi.say());
  
  }
  
  public static void main(string[] args) {
  
  junit.textui.testrunner.run(
  
  testthatwegethelloworldprompt.class);
  
  }
  
  }
  
  这个代码一点都不复杂,仅仅有一点点特别。 不管怎样,让我们详细的检查它。 我们继承了junit的testcase. (testcase 在junit的javadoc里定义是"用来运行多个test的固定装置")。 junit也定义了testsuite 由于一组关联的testcase组成..
  
  通过以下两步来建立我们简单的test case;
  
  建立junit.framework.testcase的实例.
  定义一些 以"test"开头的测试函数, 并且返回一空值.(比如 testwastranscationsuccessful(),testshow()等等).
  
  testthatwegethelloworldprompt.java 同时遵循这些标准: 这些testcase的子类含有一个testsay()的方法. 这个方法由assertequals()方法调用, 用于检验say()的返回值(按照这里的做法返回应该是不一致,因为一开始建立的helloworld 我们让say()返回的值是null).
  
  main()主函数是用来运行test并且显示输出的结果. junit的testrunnery以(swing.u)图形和本文(text.ui)的的方式来执行我们的test并反馈信息。我们就使用文本(text.ui),这个eclipse肯定支持. (译注:这里可能翻译的不怎么好,所谓文本和图形,是指你在建立testcase的时候,有一个选项,which method stubs would you like to create,选择text.ui|| swing.ui||awt.ui,一般是选择text.ui因为eclipse肯定支持这个), 依照这些文本的信息,eclipse同时会生成图形显示。(在package exploer的下面tab条上会多个junit,点它就看到了:)。
  
  又一个所以,按照现在这样测试驱动的开发的做法, 一旦我们跑起了我们的test,我们应该看到返回一些错误的信息。 点run-> run as -> junit test(注意啊, 这个testthatwegethelloworldprompt.java应该在package explorer被点中,在左边那个window中),你点到的因该是junit window(就是下面的那个tab条,注意不是package exploer),这样你就看到了junit window, 他会显示一个红色条,表示是一个失败的test。 (如果你按了运行它没有自动转到这个窗口,你可以点做下tab条 上的junit标签。)
  
 测试实践:eclipse 之 junit(图二)

  一按运行, 太好了,果然出错了。好,现在正式开始建立用于工作的helloworld代码,---点new->class,可能和原来的的重复,那就把原来的删掉。代码如下:
  
  hellowolrd.java
  
  public class helloworld {
  
  public string say() {
  
  return("hello world!");
  
  }
  
  }
  
  这及为简单的,都用不着注释。现在再来测试一下看看结果。就用上面的方法,点run-> run as jnit. 在左边的ju
 
 
上一篇: 如何使用eclipseme开发j2me程序    下一篇: struts环境配置手顺(eclipse版)
  相关文档
javabean与ejb的不同 11-17
使用 contest 进行多线程单元测试 11-17
nhibernate 示例 11-17
后向引用 11-16
如何在web工程项目中使用struts 11-17
浅析java中data类的应用技术 11-17
j2me综合--嵌入式linux中的jvm研究 02-02
sun用appserver8.0反击对手 11-17
java能为应用程序提供统一的平台吗? 11-16
编程中的一些共同的问题 11-17
轻松从vb转向基于swing的开发平台 11-17
内部窗体设计与窗体定位 11-17
《effective java》学习笔记(2) 11-17
基于java的动画编程基础第一部分 11-16
ejb 的最佳实践:工业强度的 jndi 优化 11-16
利用java配合bcb 4.0制作cpu特征侦测器 11-17
j2ee web层的曙光 -- jsf 11-17
开发技巧:spring总结实例之消息与事件 11-16
[精华]aix的域名服务 11-17
java程序员需要了解的几个开源协议 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息