Eclipse RCP 与JUnit4 的整合

今天在做我的TINPI 项目(呵呵,就是我硕士毕业设计需要做的软件——一个Eclipse RCP 技术的RFID 中间件控制系统),突然想将TDD 和一些敏捷开发的想法应用进去,我知道在开发这种GUI 的应用程序的时候,TDD 的效果并不是很显著。但是,Why not have a try?

我在网上找相关主题的文章,还查阅了我那本《Eclipse:Building Commercial-QualityPlugin-ins》,发现大部分使用的都是JUnit 3.8,而且为啥测试的代码还要放在另外一个插件中呢?这不是多余的么?既然是测试,就应该放在同一个插件中,即便查阅也会简单明了,难道开发Eclipse RPC 的框架不允许这样做,或者说这样将测试代码和被测代码放一起,JUnit 框架是不支持的?!Why not have a try?

于是乎,我就开始将JUnit4 和我的Eclipse RCP 程序集成起来,花了些功夫,但是结果还是令人满意的。让我们单刀直入,假设你已经具备了基本的Eclipse RCP 开发知识,步骤如下:

首先,在你的插件设置文件(MENIFEST.MF)的Dependencies 选项卡中加入好JUnit 4所以来的插件,如下图所示

org.junit4 插件就是JUnit4 框架的插件形式

org.eclipse.jdt.junit4.runtime 插件是必须要有的,因为Eclipse RCP 程序的测试和普通的JUnit 测试是不一样的,是有一些上下文环境需要设置的,这个插件起到将JUnit4 和Eclipse RCP 二者结合起来的作用

其次,编写一个抽象的测试类,这一步是可选的,但是你这么做,将来TestCase 多了后,就会很省力气了。代码如下:

package org.tinpi.rcp.ui.test;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.tinpi.rcp.log.TinpiLog;/**
* @author Phoenix
*
* 2008-1-20 下午03:43:34
*
* version 0.1
*/
public class AbstractTinpiTest
{
protected static final String VIEW_ID = "TINPI.readerView";

protected void before() throws Exception
{
waitForJobs();
IWorkbenchPage page = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
IViewPart view = page.findView(VIEW_ID);
if(view != null)
page.hideView(view);

waitForJobs();
} protected void delay(long waitTimeMillis)
{
Display display = Display.getCurrent(); if (display != null)
{
long endTimeMillis = System.currentTimeMillis() + waitTimeMillis;
while (System.currentTimeMillis() < endTimeMillis)
{
if (!display.readAndDispatch())
display.sleep();
}
display.update();
}
else
{
try
{
Thread.sleep(waitTimeMillis);
}
catch (InterruptedException e)
{
TinpiLog.error("Thread can not sleep");
}
}
} public void waitForJobs()
{
while (Job.getJobManager().currentJob() != null)
delay(1000);
}}

waitForJobs() 时进行必要的延时,以防止任务冲突;delay() 就是具体延时的实现; before() 进行一些上下文的设置,以便测试需要。

再次,编写具体的TestCase,使用JUnit4 的方式呦。代码如下:


import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.PlatformUI;
import org.junit.Before;
import org.junit.Test;
import org.tinpi.rcp.ui.actions.OpenReaderViewActionDelegate;
import org.tinpi.rcp.ui.test.AbstractTinpiTest;/**
* @author Phoenix
*
* 2008-1-23 下午04:45:48
*
* version 0.1
*/
public class OpenReaderViewTestCase extends AbstractTinpiTest
{ @Before
public void before() throws Exception
{
super.before();
}

@Test
public void testOpenView()
{
(new Action("OpenReaderViewTestCase") {
public void run() {
IWorkbenchWindowActionDelegate delegate =
new OpenReaderViewActionDelegate();
delegate.init(
PlatformUI
.getWorkbench()
.getActiveWorkbenchWindow());
delegate.selectionChanged(
this,
StructuredSelection.EMPTY);
delegate.run(this);
}
}).run(); // Test that the operation completed successfully
waitForJobs();
IWorkbenchPage page =
PlatformUI
.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage();

assertTrue(page.findView(VIEW_ID) != null);
}
}


可以看到,这是一个打开视图的测试,@Before 部分是使用JUnit4 的声明方式,在函数运行前进行的上下文设置;@Test 部分就是创建一个具体的打开视图的action ,并通过VIEW_ID测试该视图已经被打开了

最后,配置运行环境,并运行。要注意两点:1、选择Run As JUnit Plug-in test 第一次运行的时候八成不太成功,要么就是会调出来整个Eclipse IDE,不过这样自己会创建一个Run 方式,省的你自己一步一步配置了 2、在配置的时候,plug-ins 标签框里面,先选择plug-ins selected below only,然后反选所有的;再选择你开发的插件(我这里是TINPI),然后点击右边的Add required plug-ins ,这样,插件的最小集就选好了,不会耽误你运行的时间了,设置好的时候,如下图所示:

点击查看原始尺寸

记住,在Test 面板中,要选择是JUnit4 框架,在Main 面板中,要选择Run a product,选择你的product,如果你没创建你的product 运行方式,那么先创建吧。最后好啦,运行吧,应该能看到你的测试都通过了

至此,整合Eclipse 和JUnit4 的工作就完成了,以后我只要想用TDD 就可以使用啦,管它效果好不好。Why not have a try?


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值