FIT 和 Eclipse: 開發 Extended FIT Eclipse 插件
發表于:2007-05-25來源:作者:點擊數:
標簽:
了解基本的 Eclipse 體系結構概念,并通過一個自定義插件的使用,研究如何實現您自己的 Eclipse 插件。這篇文章是本系列中的第 2 部分(共兩部分),本系列文章的目的是向您介紹如何在基于 Eclipse 的環境中使用 Framework for Integrated Tests (FIT)。 您
了解基本的 Eclipse 體系結構概念,并通過一個自定義插件的使用,研究如何實現您自己的 Eclipse 插件。這篇文章是本系列中的第 2 部分(共兩部分),本系列文章的目的是向您介紹如何在基于 Eclipse 的環境中使用 Framework for Integrated Tests (FIT)。
您肯定對 Framework for Integrated Tests (FIT) 很感興趣,因為它是一種通用的開放框架,您可以方便地對它進行擴展,來表示各種測試。本文介紹了 Extended FIT Eclipse 插件的內部結構,它將可擴展的 Eclipse 平臺和簡便而直觀的 FIT 測試框架組合起來。
盡管 Eclipse 是構建于基于微內核的體系結構上的一種可擴展開發平臺,但它并不是 一個集成開發環境 (IDE)。相反,Eclipse 是一種開發平臺,通過適合預定義擴展點的插件可以很容易地進行擴展。這是什么意思呢?Eclipse 就像是個洋蔥,除了核心之外,它具有許多插件和擴展層次,而核心的主要職責包括啟動和運行該平臺,以及聲明和管理插件和其他的資源。Eclipse 核心不包含領域特定的信息,并且完全獨立于任何圖形用戶界面 (GUI)。
 |
可以從下載部分下載 FIT Eclipse Java™ Software Development Kit (SDK) 和 Extended FIT Eclipse 插件。
|
|
但是,您在啟動 Eclipse 時所見到的 GUI 究竟 是由什么組成的呢?Eclipse GUI 的三個主要部分是 workbench、JFace 和 Standard Widget Toolkit (SWT)。workbench 是包含和集成了 Eclipse 中所有的視圖、工具欄、菜單欄和編輯器的主窗口。JFace 是構建于 SWT 之上的高級用戶界面 (UI) 小部件庫,SWT 定義了用于處理 UI 編程任務和操作的常用小部件。SWT 定義了一組 UI 小部件,而這些小部件是 Eclipse 中所有 UI 工具的基礎。請參見圖 1,其中說明了 Eclipse 的體系結構。
圖 1. Eclipse 體系結構
PDE:插件開發可不是小孩子的游戲
開發插件不是小孩子的游戲。實際上,它與開發普通的 Java 應用程序有著明顯的區別。插件開發環境 (PDE) 是由 Eclipse 提供的一個完整的環境,它本身包含了透視圖、多重視圖和向導,以幫助您開發、測試插件并對插件進行打包。PDE 還創建了模板代碼,您可以使用這些模板代碼來構建您的插件。在為插件實現所需的接口和文件時,這些代碼可以為您節省大量的時間和精力。
大多數情況下,您可以在 Eclipse 提供的其他現有插件的基礎上構建新的插件,但是您必須在 classpath 中包含這些插件。(請注意,所有的 Eclipse 插件都是自動基于 GUI 的。根據插件所擴展的擴展點不同,插件可以是從只有 UI,到沒有 UI,以及介于兩者之間的任何情況。)開發 Eclipse 插件的第一步是將 Eclipse 切換到 PDE 透視圖。然后,通過單擊 File > New > Other > Plug-in Development > Plug-in Project 向導,創建一個 Plug-in Project 項目類型的新項目。您應該可以看到與圖 2 所示類似的內容。
圖 2. 新插件項目向導
為您的插件選擇一個合適的名稱(我使用了名稱 FitPlug-in),其他的內容均保留缺省值。在該向導的最后一個屏幕(稱為 Templates)中,請確保清除 Create plug-in using one of the templates 復選框,您將在遲些時候為項目添加擴展。單擊 Finish,Eclipse 向導將自動創建一個完全有效的(盡管功能上并不完整)Eclipse 插件以及運行該插件所需的所有文件?,F在,讓我們來看看如何添加依賴插件,以及如何定義 FIT 插件將要擴展的擴展點。


|
回頁首 |
|
依賴項和擴展
任何插件都不是孤立的。對于這條規則,Extended FIT Eclipse 插件也不例外。在完成了新插件向導后,第一步要進行的工作是添加核心 FIT Eclipse 插件作為依賴插件。(這一步假設您已經下載了核心 FIT Eclipse 插件,并將它復制到了 Eclipse 插件文件夾中。)通過添加依賴插件,Eclipse 就知道了在加載您的插件之前應該加載哪些插件。這個步驟很簡單,導航到主 Plug-in Editor 中的 Dependencies 選項卡,單擊 Add,然后選擇要添加的合適插件(請參見圖 3)。
圖 3. 添加插件依賴項
現在,您已經得到了一個基本的插件,并且告訴了 Eclipse 它所依賴的插件。但是這里有一個最重要的問題:您的插件要完成什么工作呢?它將對 Eclipse 的哪些部分進行擴展呢?為了回答這些問題,請選擇您的插件所擴展的擴展點。同樣,這項操作也很簡單,導航到 Plug-in Editor 中的 Extensions 選項卡,并添加所需的擴展。在 Extended FIT Eclipse 插件示例中,您可以使用 actionSet
擴展來為 Eclipse Editor 添加一個新的菜單。在添加了 actionSet
之后,您可以繼續添加菜單、分隔符和可以從菜單執行的操作。在添加了需要的內容后,其最后的結果應該與圖 4 所示類似。
圖 4. 添加插件擴展以及創建菜單
請注意,您添加了一項 Action,并且還提供了當用戶單擊該菜單項時應該調用的類。在 Extended FIT Eclipse 插件示例中,這個類稱為 com.punditlabs.fit.actions.RunFITAction
。在本文后面的內容中,我將更詳細地對這個類進行介紹。


|
回頁首 |
|
XML
有人說,如果插件沒有自己的可擴展標記語言 (XML),它就不是一個真正的插件。對于一個插件來說,插件說明文件 plugin.xml 是一個核心文件,它描述了插件如何對平臺進行擴展、它本身公開為哪個擴展以及相應的功能如何實現。該說明文件是一個與插件一同加載的 .xml 文件。運行和顯示該插件需要的所有細節信息,如圖標和菜單項,都包含在這個說明文件中。由一個單獨的 .jar 文件提供的實現二進制代碼是遲加載 的,也就是說,當插件運行后才進行加載。
Extended FIT Eclipse 插件擁有自己的 plugin.xml 文件,其中定義了 Eclipse 需要知道的關于加載該插件的所有信息,以及該插件所擴展的擴展點。這個文件中還提供了其他的細節信息,如類、資源和所使用的圖標。大多數情況下,您不必手動編寫該文件,Eclipse 擅長根據您在 Plug-in Editor 選項卡中進行的更改自動地生成相應的 plugin.xml 文件。清單 1 顯示了 Extended FIT Eclipse 插件的 plugin.xml 文件。
清單 1. Extended FIT Eclipse 插件的 plugin.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
<extension
point="org.eclipse.ui.actionSets">
<actionSet
id="com.punditlabs.fit.actionSet"
label="FIT Action Set"
visible="true">
<menu
id="fitMenu"
label="FIT">
<separator name="fitGroup"/>
</menu>
<action
class="com.punditlabs.fit.actions.RunFITAction"
icon="icons/logo.gif"
id="com.punditlabs.fit.actions.RunFITAction"
label="&Run FIT"
menubarPath="fitMenu/fitGroup"
toolbarPath="fitGroup"
tooltip="Run FIT"/>
</actionSet>
</extension>
</plugin>
|
在本示例中,Extended FIT Eclipse 插件定義了您使用 Plug-in Editor 完成的工作,其中包括選擇要擴展的 Eclipse UI 的 actionSet
擴展點,并為它添加了相應的菜單。


|
回頁首 |
|
插件
到目前為止,我一直在討論關于插件及其描述符?,F在,讓我們來看看實現該插件的類文件。Plugin
類是所有插件運行時類實現的抽象超類(請參見清單 2)。FITPlugin
類繼承了這個類,并覆蓋了生命周期方法以實現對該平臺產生的生命周期請求的響應。
Plugin
類代表整個插件,而不是該插件所聲明的特殊擴展的特定實現。插件不需要顯式地指定一個自定義 Plugin
類,如果沒有指定這樣的類,那么運行時平臺將提供一個忽略所有生命周期請求的缺省插件運行時對象。
清單 2. Extended FIT Eclipse 插件的 Plugin 類
package com.punditlabs.fit;
import org.eclipse.ui.plugin.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.osgi.framework.BundleContext;
/**
* The main plug-in class to be used in the desktop.
*/
public class FitPlugin extends AbstractUIPlugin {
//The shared instance.
private static FitPlugin plugin;
/**
* The constructor.
*/
public FitPlugin() {
plugin = this;
}
/**
* This method is called upon plug-in activation
*/
public void start(BundleContext context) throws Exception {
super.start(context);
}
/**
* This method is called when the plug-in is stopped
*/
public void stop(BundleContext context) throws Exception {
super.stop(context);
plugin = null;
}
/**
* Returns the shared instance.
*/
public static FitPlugin getDefault() {
return plugin;
}
/**
* Returns an image descriptor for the image file at the given
* plug-in relative path.
*
* @param path the path
* @return the image descriptor
*/
public static ImageDescriptor getImageDescriptor(String path) {
return AbstractUIPlugin.imageDescriptorFromPlugin("com.punditlabs.fit", path);
}
}
|
大多數情況下,在開發插件時,您不需要實現 Plugin
類本身的任何內容。除非對于該插件,具有復雜的生命周期管理需求,否則自動生成的缺省實現應該可以滿足要求。


|
回頁首 |
|
操作
插件中所有的內容都是自動生成的嗎?基本上是的,但是 Extended FIT Eclipse 插件中的操作部分在 RunFITAction
類中。RunFITAction
類實現了 IWorkbenchWindowActionDelegate
接口,而該接口又允許 Eclipse 為您的插件使用一個代理,以便能夠執行遲加載。這意味著直到需要的時候才加載這個插件。IWorkbenchWindowActionDelegate
接口方法允許您的插件與代理進行交互。清單 3 顯示了 RunFITAction
類的實現。
清單 3. RunFITAction 類
package com.punditlabs.fit.actions;
import java.io.BufferedReader;
..
/**
* Our sample action implements a workbench action delegate.
* The action proxy will be created by the workbench and
* shown in the UI. When the user tries to use the action,
* this delegate will be created, and execution will be
* delegated to it.
* @see IWorkbenchWindowActionDelegate
*/
public class RunFITAction implements IWorkbenchWindowActionDelegate {
private IWorkbenchWindow window;
Shell shell;
Display display;
String inFile, outFile, fixtureFile;
Helper fitHelper = new Helper(shell,display,inFile,outFile,fixtureFile);
/**
* The constructor.
*/
public RunFITAction() {
super();
}
/**
* The action has been activated. The argument of the
* method represents the 'real' action sitting
* in the workbench UI.
* @see IWorkbenchWindowActionDelegate#run
*/
public void run(IAction action) {
/*
* Gets the Current Display and sets up the Display Shell.
* Creates the layout manager and sets up the width and height of the window.
*/
fitHelper.initDisplay();
/*
* Creates the Input File selection button and adds the associated
* File Dialog action
*/
Label inputName = new Label(shell, SWT.NONE);
inputName.setText("Input File: ");
final Text inputInfo = new Text(shell, SWT.SINGLE|SWT.BORDER);
inputInfo.setTabs(5);
Button browse = fitHelper.createInputButton(inputInfo);
/*
* Creates the Ouput File selection button and adds the associated
* File Dialog action
*/
Label outputName = new Label(shell, SWT.NONE);
outputName.setText("Output File: ");
final Text outputInfo = new Text(shell, SWT.SINGLE|SWT.BORDER);
Button browseOut = fitHelper.createOutputButton(outputInfo);
/*
* Creates the Fixture Jar selection button and adds the associated
* File Dialog action
*/
Label fixFolderName = new Label(shell, SWT.NONE);
fixFolderName.setText("Fixture Jar: ");
final Text fixtureInfo = new Text(shell, SWT.SINGLE|SWT.BORDER);
Button fixture = fitHelper.createFixtureJarButton(fixtureInfo);
/*
* Creates the all-important Run FIT Test button
*/
Button runTest = fitHelper.createRunFITButton();
FormData data = fitHelper.layoutForm(inputName, inputInfo, browse,
outputName, outputInfo, browseOut, fixFolderName, fixtureInfo, fixture);
runTest.setLayoutData(data);
/*
* Display cleanup activities.
*/
fitHelper.cleanupDisplay();
}
/**
* Selection in the workbench has been changed. We
* can change the state of the 'real' action here
* if we want, but this can only happen after
* the delegate has been created.
* @see IWorkbenchWindowActionDelegate#selectionChanged
*/
public void selectionChanged(IAction action, ISelection selection) {
}
/**
* We can use this method to dispose of any system
* resources we previously allocated.
* @see IWorkbenchWindowActionDelegate#dispose
*/
public void dispose() {
}
/**
* We will cache the window object to
* be able to provide a parent shell for the message window.
* @see IWorkbenchWindowActionDelegate#init
*/
public void init(IWorkbenchWindow window) {
this.window = window;
}
}
|

 |


|
回頁首 |
|
結果
這里并沒有深入地研究大量的細節內容(即所有的代碼),而是給出了 Extended FIT Eclipse 插件的工作原理。Extended FIT Eclipse 插件的主要目標是,通過運行 FIT fixture 并查看執行的結果,使得 Eclipse 開發人員能夠輕松地使用 FIT。為了達到這個目的,在從 Eclipse FIT 菜單中調用 Extended FIT Eclipse 插件時,允許用戶選擇輸入和輸出 .html 文件、包含該 fixture 的 .jar 文件、System Under Test (SUT) 的類文件。
 |
更多的實現細節
調用 fit.FITRunner 類的實際過程如下:Extended FIT Eclipse 插件將產生一個獨立的 Java 虛擬機 (JVM) 進程,在將 fixture .jar 文件添加到 classpath 之后,它可以根據用戶選擇的輸入和輸出文件運行相應的類。捕獲該進程的執行結果并顯示給用戶。如果所有的內容都沒有問題,那么 fit.FITRunner 將返回失敗和成功測試的次數。
|
|
為了達到這個目的,Extended FIT Eclipse 插件必須完成下列任務:
- 處理 Run FIT 窗口的顯示和布局。(
fitHelper.initDisplay()
函數可以完成這項工作。)
- 獲取所選擇的輸入和輸出文件的位置。(
fitHelper.createInputButton()
和 fitHelper.createOutputButton()
函數可以完成這項工作。)
- 獲取所選擇的 .jar 文件的位置。(這將在
fitHelper.createFixtureJarButton()
方法中完成。)
- 將 .jar 文件加載到插件工作區。
- 調用
fit.FileRunner
類,然后將輸入和輸出文件傳遞到其命令行。確保 fixture .jar 文件位于 classpath 中。
- 捕獲運行的結果,并將它們顯示給用戶。(這一步和上面兩個步驟由
fitHelper.createRunFITButton()
函數完成。)
- 進行清理工作。(這項工作由
fitHelper.cleanupDisplay()
函數完成。)


|
回頁首 |
|
打包和配送
您已經看到了如何開發組成 Extended FIT Eclipse 插件的主要組成部分,您還需要了解如何將您的新插件送到正熱切期盼的 Eclipse 和 FIT 開發人員的手中。同樣地,Eclipse 的 Export 向導可以解決這個問題,該向導生成了一個插件存檔,您可以很容易地對該存檔進行分發(請參見圖 5)。該存檔中包含了所需的代碼和資源。安裝該插件的最簡單的方法是將其中的內容提取到 Eclipse 安裝中,如果已加載了所有需要的元素,Eclipse 會加載該 Extended FIT Eclipse 插件。這種安裝類型稱為非托管的,因為用戶承擔了查找和更新各種已安裝的插件的責任。
圖 5. 導出 Extended FIT Eclipse 插件 .jar 文件


|
回頁首 |
|
結束語
Eclipse 是一個令人驚訝的工具。更重要的是,它是一個基于開放和可擴展體系結構的富客戶端應用程序平臺。在 Eclipse 中,任何事物都是一個擴展該環境中特定擴展點的插件。PDE 為插件開發人員提供了功能強大的工具,這些工具可以實現大部分任務的自動化,從而使得您可以快速而輕松地踏上插件開發之旅。PDE 還支持完整的生命周期開發,包括分發和維護。
在本文中,您學習了如何開發 Extended FIT Eclipse 插件,并了解了其主要組成部分。通過使用 Eclipse 提供的功能強大的 PDE,您可以利用 FIT 的功能來進行集成測試。通過擴展 Basic FIT Eclipse 插件,您可以利用 FIT 和 Eclipse 的功能來執行集成測試。


|
回頁首 |
|
下載
描述 | 名字 | 大小 | 下載方法 |
Core FIT Eclipse plug-in |
fit.eclipse.java.sdk-1.1.zip |
140KB |
HTTP |
Extended FIT Eclipse plug-in and code samples |
com.punditlabs.fit_1.0.0.jar |
101KB |
HTTP |
原文轉自:http://www.kjueaiud.com
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|