基本信息
中文名称 eclipse
外文名称 eclipse
早期开发商 OTI、IBM
类别 JAVA程序
适用领域计算机
目录
1基本含义
2历史
3发行版本
4语言拓展
5字符集设置
6使用技巧
7学习资料
8主要组成
9软件开发包
10新版本特点
eclipse-galileo
虽然大多数用户很乐于将 Eclipse 当作 Java 集成开发环境(IDE)来使用,但 Eclipse 的目标却不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用Java语言开发的,但它的用途并不限于 Java 语言例如,支持诸如C/C++、COBOL、PHP、Android等编程语言的插件已经可用,或预计将会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。
基于 Eclipse 的应用程序的一个突出例子是 IBM Rational Software Architect,它构成了 IBM Java 开发工具系列的基础。
历史折叠
Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。2003年,Eclipse 3.0选择OSGi服务平台规范为运行时架构。2007年6月,稳定版3.3发布2008年6月发布代号为Ganymede的3.4版2009年6月发布代号为Galileo的3.5版2010年6月发布代号为Helios的3.6版2011年6月发布代号为Indigo的3.7版2012年6月发布代号为Juno的4.2版2013年6月发布代号为Kepler的4.3版2014年6月发布代号为Luna的4.4版2015年6月项目要发布代号为Mars的4.5版。
发行版本折叠
从2006年起,Eclipse基金会每年都会安排同步发布(simultaneous release)。至今,同步发布主要在6月进行,并且会在接下来的9月及2月释放出SR1及SR2版本。
版本代号
平台版本
主要版本发行日期
SR1发行日期
SR2发行日期
Callisto
3.2
2006年6月26日
N/A
N/A
Europa
3.3
2007年6月27日
2007年9月28日
2008年2月29日
Ganymede
3.4
2008年6月25日
2008年9月24日
2009年2月25日
Galileo
3.5
2009年6月24日
2009年9月25日
2010年2月26日
Helios
3.6
2010年6月23日
2010年9月24日
2011年2月25日
Indigo
3.7
2011年6月22日
2011年9月23日
2012年2月24日
Juno
3.8及4.2
2012年6月27日
2012年9月28日
2013年3月1日
Kepler
4.3
2013年6月26日
2013年9月27日
2014年2月28日
Luna
4.4
2014年6月25日
2014年9月25日
2015年2月27日
Mars
4.5
2015年3月14日
N/A
N/A
展开
语言拓展折叠
Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,通过安装不同的插件Eclipse可以支持不同的计算机语言,比如C++和Python等开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。
Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。Eclipse项目IBM发起,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase等。Eclipse是一个开放源码项目,它其实是Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。随后还有包括Oracle在内的许多大公司也纷纷加入了该项目,Eclipse的目标是成为可进行任何语言开发的IDE集成者,使用者只需下载各种语言的插件即可。
字符集设置折叠
点击导航栏里的 window ->Preferences
选择 General ->Content Types
在右侧红框里选择你要修改编码的文件类型
(一般我们会用到CSS,Java Source File,Java Propertis File 等等),
在绿框里修改编码,一般用"utf-8"。
修改完点击OK。
前三步是针对文件的,
我们还需要对我们的工作空间设置字符集编码。
我们可以去 General ->Workspace ->然后在图中的中间的红框里选择你需要的字符集,
然后你右下角的Apply执行 *** 作。
使用技巧折叠
快捷方式折叠
<!--[if !supportLists]-->0. Ctrl + 1 (快速修复)
<!--[if !supportLists]-->1. Ctrl + D (删除当前行)
<!--[if !supportLists]-->2. Ctrl + Alt + ↓(复制当前行到下一行)
<!--[if !supportLists]-->3. Alt + / 或者说是 Ctrl + 空格(由于后者与输入法的快捷键冲突,所以,我一般都用前者) 作用:快速插入。
<!--[if !supportLists]-->4. Alt+Shift+R 重命名非常好用。
<!--[if !supportLists]-->5. Ctrl + Q 定位到最后编辑的地方。
<!--[if !supportLists]-->6. Ctrl + Shift + O 自动导入包。
<!--[if !supportLists]-->7. Ctrl+/ 注释当前行,再按则取消注释。
<!--[if !supportLists]-->8. Ctrl+K快速查找。
<!--[if !supportLists]-->9. Ctrl + Shift + F 自动缩进。
常用快捷键折叠
Eclipse最全快捷键,熟悉快捷键可以帮助开发事半功倍,节省更多的时间来用于做有意义的事情。
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在当前行插入空行(原理同上条)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+O 快速显示 OutLine
Ctrl+T 快速显示当前类的继承结构
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中的Word快速定位到下一个
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等 *** 作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没
有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+X 把当前选中的文本全部变为大写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)
下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)
Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)
Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)
Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)
Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)
Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)
Alt+Shift+I 合并变量(可能这样说有点不妥Inline)
Alt+Shift+V 移动函数和变量(不怎么常用)
Alt+Shift+Z 重构的后悔药(Undo)
插件开发折叠
Eclipse的插件机制是轻型软件组件化架构。在客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java以外的其他语言。已有的分离的插件已经能够支持C/C++(CDT)、Perl、Ruby,Python、telnet和数据库开发。插件架构能够支持将任意的扩展加入到现有环境中,例如配置管理,而决不仅仅限于支持各种编程语言。
Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。Eclipse基本内核包括:图形API (SWT/Jface), Java开发环境插件(JDT ),插件开发环境(PDE)等。
插件安装折叠
Eclipse插件的安装方法大体有以下几种方式:
第一种:直接复制法
假设Eclipse的安装目录在C:\eclipse,解压下载的eclipse 插件或者安装eclipse 插件到指定目录AA(如:c:\AA)文件夹,打开AA 文件夹,在AA文件夹里分别包含两个文件夹features和plugins ,然后把两个文件夹里的文件分别复制到C:\eclipse下所对应的文件夹下的features 和plugins 下,一般的把插件文件直接复制到eclipse目录里是最直接也是最愚蠢的一种方法!因为日后想要删除这些插件会非常的困难,不推荐使用。
注意:直接将插件包解压到plugins文件夹下之后,重启eclipse,可能不会加载新的插件。
解决方法是:
1、打开命令行,到当前eclipse的目录下,输入eclipse -clean,重新启动eclipse,这样eclipse就会加上新的插件了。
2、如果插件不能生效,则请将eclipse\configuration\org.eclipse.update目录删除后再启动eclipse
你可以在eclipse的菜单"Help"-->"About EclipseSDK"-->"Feature Details" 和"Plug-in Details"中看到新安装的插件。
第二种:使用link文件法
a.假设Eclipse的安装目录在C:\eclipse,在该文件夹下,新建这样的目录结构C:\eclipse\PluginsEclipse\jode\eclipse
b.解压下载的eclipse 插件或者安装eclipse 插件到指定目录BB(如:C:\BB)文件夹,打开BB文件夹,然后把 BB文件夹里的两个文件夹features和plugins复制到刚新建好的,这样eclipse中就有了两个插件目录features and plugins下。
c.在C:\eclipse目录中新建links(C:\eclipse\links)目录,在links目录中建立一个以link为扩展名的文本文件如jode.link,内容如下path=C:/eclipse/PluginsEclipse/jode 或者path=C:\\eclipse\\PluginsEclipse\\jode(插件的目录),保存后重启eclipse插件就会安装完成。
注意:link文件中path=插件目录的path路径分隔要用\\或是/
Java代码
/eclipse/
links/
jode.link
webtools.link
updateManager.link
...
...
/eclipse/ links/ jode.link webtools.linkupdateManager.link ... ... 可以在eclipse的菜单"Help"-->"AboutEclipseSDK"-->"Feature Details" 和"Plug-in Details"中看到新安装的插件。
第三种:使用eclipse自带图形界面安装
选择Help >Software Updates >ManagerConfiguration,再选择Add >Extension Location 找到你要安装插件的目录就可以了。使用eclipse的help->SoftwareUpdates ->Find and install... searchfor new features... 输入软件安装地址进行安装强烈推荐这种方法,优点很多比如可以方便的添加删除,也不用自己写link文件!
备注:Eclipse插件的目录结构
Java代码
/eclipse-plugins/
eclipse/
.eclipseextension
features/
plugins/
第2.3种方法所指向的目录都指的是"eclipse"目录,
如果用第3种方法,在eclipse这个目录下必须有文件.eclipseextension,如果下载的插件没有这个文件,
那就随便eclipse安装目录下的那个文件拷过去就行,只要有这么个文件就可以了,内容没什么用,主要是一些版本信息。例如:
Java代码
id=org.eclipse.platform name=Eclipse Platform
version=3.1.1
id=org.eclipse.platform name=Eclipse Platform version=3.1.1
第四种:使用dropins安装插件
EclipseMacketpalce从Eclipse3.5开始,安装目录下就多了一个dropins目录。只要将插件解压后拖到该目录即可安装插件。
比如安装svn插件subclipse-1.8.16.zip,只需要如下的三步即可:
1、使用winrar等压缩软件将压缩包解压至某一文件夹,比如subclipse-1.8.16
2、将此目录移动/复制至Eclipse安装目录下的dropins目录
3、重启Eclipse。
由于此种安装方式可以将不同的插件安装在不同的目录里,并且不用麻烦地写配置文件,因此管理起来会非常方便,推荐使用。
第五种:使用EclipseMacketplace
在新版eclipse中选择Help >Software Updates >Eclipse Macketplace,这里有eclipse的插件市场,如图所示,可以直接搜索安装需要的插件,不必配置,一键安装,使用更加方便了。
学习资料折叠
《Eclipse从入门到精通》
《Eclipse使用入门教程》
《Eclipse Web开发从入门到精通(实例版)》
主要组成折叠
Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成--Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。Eclipse Platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。
软件开发包折叠
Eclipse SDK(软件开发者包)是Eclipse Platform、JDT和PDE所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse项目生产的软件以 GPL发布,第三方组件有各自自身的许可协议。
新版本特点折叠
1.NLS string hover有一个Open in Properties File动作
2.在Caller模式下,调用层级(Call Hierarchy)有一个在上下文菜单中有一个Expand With Constructors动作
3.当你在编辑器中输入的时候,Java比较编辑器会更新其结构
4.有一个新的toString()产生器
5.为可覆盖方法增加了一个Open Implementation链接,可以直接打开其实现
6.编辑器与执行环境一致
7.Debug视图现在提供了breadcrumb(面包屑),显示了活动的debug上下文
8.可运行的JAR文件输出向导还可以把所需的类库打包进一个要输出的可运行JAR文件,或打包进与紧挨着该JAR的一个目录中
9.当在写一个分配表达式(allocation expression)时发生补全 *** 作,ch内容助手可以提示一个类的可用构造方法
10.如果检测到无用代码,编译器可以发出警告
11.类库、变量或容器入口的路径可以是与项目相关的任何位置
12.在Jovadoc hover的头部及Javadoc视图中,都提供了引用其他类型和成员的链接
13.随该Eclipse发行的JUnit4版本更新为4.5
14.Javadoc视图及hovers都支持{@inheritDoc}标签并给覆盖方法增加链接
15.同一值的比较现在由编译器检测,默认情况下会发出警告
测试的概念长期以来,我所接触的软件开发人员很少有人能在开发的过程中进行测试工作。大部分的项目都是在最终验收的时候编写测试文档。有些项目甚至没有测试文档。现在情况有了改变。我们一直提倡UML、RUP、软件工程、CMM,目的只有一个,提高软件编写的质量。举一个极端的例子:如果你是一个超级程序设计师,一个传奇般的人物。(你可以一边喝咖啡,一边听着音乐,同时编写这 *** 作系统中关于进程调度的模块,而且两天时间内就完成了!)我真得承认,有这样的人。(那个编写UNIX中的vi编辑器的家伙就是这种人。)然而非常遗憾的是这些神仙们并没有留下如何修成正果的README。所以我们这些凡人--在同一时间只能将注意力集中到若干点(据科学统计,我并不太相信,一般的人只能同时考虑最多7个左右的问题,高手可以达到12个左右),而不能既纵览全局又了解细节--只能期望于其他的方式来保证我们所编写的软件质量。
为了说明我们这些凡人是如何的笨。有一个聪明人提出了软件熵(software entropy)的概念:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻。你可能会争辩,在这个例子中,设计很好的状态实际上并不好,如果好的话,就不会发生你所说的情况。是的,看来你变聪明了,可惜你还应该注意到两个问题:1)我们不能指望在恐龙纪元(大概是十年前)设计的结构到了现在也能适用吧。2)拥有签字权的客户代表可不理会加入一个新功能是否会对软件的结构有什么影响,即便有影响也是程序设计人员需要考虑的问题。如果你拒绝加入这个你认为致命的新功能,那么你很可能就失去了你的住房贷款和面包(对中国工程师来说也许是米饭或面条,要看你是南方人还是北方人)。
另外,需要说明的是我看过的一些讲解测试的书都没有我写的这么有人情味(不好意思...)。我希望看到这片文章的兄弟姐妹能很容易地接受测试的概念,并付诸实施。所以有些地方写的有些夸张,欢迎对测试有深入理解的兄弟姐妹能体察民情,并不吝赐教。
好了,我们现在言归正传。要测试,就要明白测试的目的。我认为测试的目的很简单也极具吸引力:写出高质量的软件并解决软件熵这一问题。想象一下,如果你写的软件和Richard Stallman(GNU、FSF的头儿)写的一样有水准的话,是不是很有成就感?如果你一致保持这种高水准,我保证你的薪水也会有所变动。
测试也分类,白箱测试、黑箱测试、单元测试、集成测试、功能测试...。我们先不管有多少分类,如何分类。先看那些对我们有用的分类,关于其他的测试,有兴趣的人可参阅其他资料。白箱测试是指在知道被测试的软件如何(How)完成功能和完成什么样(What)的功能的条件下所作的测试。一般是由开发人员完成。因为开发人员最了解自己编写的软件。本文也是以白箱测试为主。黑箱测试则是指在知道被测试的软件完成什么样(What)的功能的条件下所作的测试。一般是由测试人员完成。黑箱测试不是我们的重点。本文主要集中在单元测试上,单元测试是一种白箱测试。目的是验证一个或若干个类是否按所设计的那样正常工作。集成测试则是验证所有的类是否能互相配合,协同完成特定的任务,目前我们暂不关心它。下面我所提到的测试,除非特别说明,一般都是指单元测试。
需要强调的是:测试是一个持续的过程。也就是说测试贯穿与开发的整个过程中,单元测试尤其适合于迭代增量式(iterative and incremental)的开发过程。Martin Fowler(有点儿像引用孔夫子的话)甚至认为:“在你不知道如何测试代码之前,就不应该编写程序。而一旦你完成了程序,测试代码也应该完成。除非测试成功,你不能认为你编写出了可以工作的程序。”我并不指望所有的开发人员都能有如此高的觉悟,这种层次也不是一蹴而就的。但我们一旦了解测试的目的和好处,自然会坚持在开发过程中引入测试。
因为我们是测试新手,我们也不理会那些复杂的测试原理,先说一说最简单的:测试就是比较预期的结果是否与实际执行的结果一致。如果一致则通过,否则失败。看下面的例子:
//将要被测试的类
public class Car {
public int getWheels() {
return 4
}
}
//执行测试的类
public class testCar {
public static void main(String[] args) {
testCar myTest = new testCar()
myTest.testGetWheels()
}
public testGetWheels() {
int expectedWheels = 4
Car myCar = Car()
if (expectedWheels==myCar.getWheels())
System.out.println("test [Car]: getWheels works perfected!")
else
System.out.println("test [Car]: getWheels DOESN'T work!")
}
}
如果你立即动手写了上面的代码,你会发现两个问题,第一,如果你要执行测试的类testCar,你必须必须手工敲入如下命令:
[Windows] d:>java testCar
[Unix] % java testCar
即便测试如例示的那样简单,你也有可能不愿在每次测试的时候都敲入上面的命令,而希望在某个集成环境中(IDE)点击一下鼠标就能执行测试。后面的章节会介绍到这些问题。第二,如果没有一定的规范,测试类的编写将会成为另一个需要定义的标准。没有人希望查看别人是如何设计测试类的。如果每个人都有不同的设计测试类的方法,光维护被测试的类就够烦了,谁还顾得上维护测试类?另外有一点我不想提,但是这个问题太明显了,测试类的代码多于被测试的类!这是否意味这双倍的工作?不!1)不论被测试类-Car 的 getWheels 方法如何复杂,测试类-testCar 的testGetWheels 方法只会保持一样的代码量。2)提高软件的质量并解决软件熵这一问题并不是没有代价的。testCar就是代价。
我们目前所能做的就是尽量降低所付出的代价:我们编写的测试代码要能被维护人员容易的读取,我们编写测试代码要有一定的规范。最好IDE工具可以支持这些规范。 好了,你所需要的就是JUnit。一个Open Source的项目。用其主页上的话来说就是:“JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing work)。用于Java开发人员编写单元测试之用。”所谓框架就是 Erich Gamma 和 Kent Beck 定下了一些条条框框,你编写的测试代码必须遵循这个条条框框:继承某个类,实现某个接口。其实也就是我们前面所说的规范。好在JUnit目前得到了大多数软件工程师的认可。遵循JUnit我们会得到很多的支持。回归测试就是你不断地对所编写的代码进行测试:编写一些,测试一些,调试一些,然后循环这一过程,你会不断地重复先前的测试,哪怕你正编写其他的类,由于软件熵的存在,你可能在编写第五个类的时候发现,第五个类的某个 *** 作会导致第二个类的测试失败。通过回归测试我们抓住了这条大Bug。
回归测试框架-JUnit
通过前面的介绍,我们对JUnit有了一个大概的轮廓。知道了它是干什么的。现在让我们动手改写上面的测试类testCar使其符合Junit的规范--能在JUnit中运行。
//执行测试的类(JUnit版)
import junit.work.*
public class testCar extends TestCase {
protected int expectedWheels
protected Car myCar
public testCar(String name) {
super(name)
}
protected void setUp() {
expectedWheels = 4
myCar = new Car()
}
public static Test suite() {
/*
* the type safe way
*
TestSuite suite= new TestSuite()
suite.addTest(
new testCar("Car.getWheels") {
protected void runTest() { testGetWheels()}
}
)
return suite
*/
/*
* the dynamic way
*/
return new TestSuite(testCar.class)
}
public void testGetWheels() {
assertEquals(expectedWheels, myCar.getWheels())
}
}
改版后的testCar已经面目全非。先让我们了解这些改动都是什么含义,再看如何执行这个测试。
1>import语句,引入JUnit的类。(没问题吧)
2>继承 TestCase 。可以暂时将一个TestCase看作是对某个类进行测试的方法的集合。详细介绍请参看JUnit资料
3>setUp()设定了进行初始化的任务。我们以后会看到setUp会有特别的用处。
4>testGetWheeels()对预期的值和myCar.getWheels()返回的值进行比较,并打印比较的结果。assertEquals是junit.work.Assert中所定义的方法,junit.work.TestCase继承了junit.work.Assert。
5>suite()是一个很特殊的静态方法。JUnit的TestRunner会调用suite方法来确定有多少个测试可以执行。上面的例子显示了两种方法:静态的方法是构造一个内部类,并利用构造函数给该测试命名(test name, 如 Car.getWheels ),其覆盖的runTest()方法,指明了该测试需要执行那些方法--testGetWheels()。动态的方法是利用内省(reflection )来实现runTest(),找出需要执行那些测试。此时测试的名字即是测试方法(test method,如testGetWheels)的名字。JUnit会自动找出并调用该类的测试方法。
6>将TestSuite看作是包裹测试的一个容器。如果将测试比作叶子节点的话,TestSuite就是分支节点。实际上TestCase,TestSuite以及TestSuite组成了一个composite Pattern。 JUnit的文档中有一篇专门讲解如何使用Pattern构造Junit框架。有兴趣的朋友可以查看JUnit资料。
如何运行该测试呢?手工的方法是键入如下命令:
[Windows] d:>java junit.textui.TestRunner testCar
[Unix] % java junit.textui.TestRunner testCar
别担心你要敲的字符量,以后在IDE中,只要点几下鼠标就成了。运行结果应该如下所示,表明执行了一个测试,并通过了测试:
.
Time: 0
OK (1 tests)
如果我们将Car.getWheels()中返回的的值修改为3,模拟出错的情形,则会得到如下结果:
.F
Time: 0
There was 1 failure:
1) testGetWheels(testCar)junit.work.AssertionFailedError: expected:<4>but was:<3>
at testCar.testGetWheels(testCar.java:37)
FAILURES!!!
Tests run: 1, Failures: 1, Errors: 0
注意:Time上的小点表示测试个数,如果测试通过则显示OK。否则在小点的后边标上F,表示该测试失败。注意,在模拟出错的测试中,我们会得到详细的测试报告“expected:<4>but was:<3>”,这足以告诉我们问题发生在何处。下面就是你调试,测试,调试,测试...的过程,直至得到期望的结果。
Design by Contract(这句话我没法翻译)
Design by Contract本是Bertrand Meyer(Eiffel语言的创始人)开发的一种设计技术。我发现在JUnit中使用Design by Contract会带来意想不到的效果。Design by Contract的核心是断言(assersion)。断言是一个布尔语句,该语句不能为假,如果为假,则表明出现了一个bug。Design by Contract使用三种断言:前置条件(pre-conditions)、后置条件(post-conditions)和不变式(invariants)这里不打算详细讨论Design by Contract的细节,而是希望其在测试中能发挥其作用。
前置条件在执行测试之前可以用于判断是否允许进入测试,即进入测试的条件。如 expectedWheels >0, myCar != null。后置条件用于在测试执行后判断测试的结果是否正确。如 expectedWheels==myCar.getWheels()。而不变式在判断交易(Transaction)的一致性(consistency)方面尤为有用。我希望JUnit可以将Design by Contract作为未来版本的一个增强。
Refactoring(这句话我依然没法翻译)
Refactoring本来与测试没有直接的联系,而是与软件熵有关,但既然我们说测试能解决软件熵问题,我们也就必须说出解决之道。(仅仅进行测试只能发现软件熵,Refactoring则可解决软件熵带来的问题。)软件熵引出了一个问题:是否需要重新设计整个软件的结构?理论上应该如此,但现实不允许我们这么做。这或者是由于时间的原因,或者是由于费用的原因。重新设计整个软件的结构会给我们带来短期的痛苦。而不停地给软件打补丁甚至是补丁的补丁则会给我们带来长期的痛苦。(不管怎样,我们总处于水深火热之中)
Refactoring是一个术语,用于描述一种技术,利用这种技术我们可以免于重构整个软件所带来的短期痛苦。当你refactor时,你并不改变程序的功能,而是改变程序内部的结构,使其更易理解和使用。如:该变一个方法的名字,将一个成员变量从一个类移到另一个类,将两个类似方法抽象到父类中。所作的每一个步都很小,然而1-2个小时的Refactoring工作可以使你的程序结构更适合目前的情况。Refactoring有一些规则:
1>不要在加入新功能的同时refactor已有的代码。在这两者间要有一个清晰的界限。如每天早上1-2个小时的Refactoring,其余时间添加新的功能。
2>在你开始Refactoring前,和Refactoring后都要保证测试能顺利通过。否则Refactoring没有任何意义。
3>进行小的Refactoring,大的就不是Refactoring了。如果你打算重构整个软件,就没有必要Refactoring了。
只有在添加新功能和调试bug时才又必要Refactoring。不要等到交付软件的最后关头才Refactoring。那样和打补丁的区别不大。Refactoring 用在回归测试中也能显示其威力。要明白,我不反对打补丁,但要记住打补丁是应该最后使用的必杀绝招。(打补丁也需要很高的技术,详情参看微软网站)
IDE对JUnit的支持
目前支持JUnit的Java IDE 包括 IDE 方式 个人评价(1-5,满分5)
Forte for Java 3.0 Enterprise Edition plug-in 3
JBuilder 6 Enterprise Edition integrated with IDE 4
Visual Age for Java support N/A
在IDE中如何使用JUnit,是非常具体的事情。不同的IDE有不同的使用方法。一旦理解了JUnit的本质,使用起来就十分容易了。所以我们不依赖于具体的IDE,而是集中精力讲述如何利用JUnit编写单元测试代码。心急的人可参看资料。
session.update(q)这里调用的不正确,update方法参数,传输的应该是一个对应数据库表的实体对象(修改亦是如此)。
这个错误有2种改法
①session.update(q)这句替换为query.executeUpdate()
②直接使用session.update(q)进行修改,但是参数传递的是Wife这个对象,你只要将对象里面的值赋值好,主键有值,hibernate会完成下面的修改工作。
有问题再追问,good luck!~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)