一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用 Hudson 進行持續(xù)集成

 wangxq 2010-07-06

兩個或更多的開發(fā)人員就一個項目協(xié)同工作時會將多個開發(fā)人員的代碼集成在一起,如果某個開發(fā)人員的代碼有不良的影響或代碼之間發(fā)生交互,就可能會出現(xiàn)問題。在“傳統(tǒng)”開發(fā)環(huán)境下,各個開發(fā)人員可能會在較長的時間內(nèi)獨立完成各自的代碼編寫工作,這些代碼集成問題可能在實際編寫代碼之后很長時間才被發(fā)現(xiàn),與在開發(fā)周期早期發(fā)現(xiàn)這些問題相比,這樣會加大識別和解決這些集成問題的難度。為了解決這一滯后問題,應(yīng)運而生了一種稱為持續(xù)集成(即 CI)的新的開發(fā)技術(shù)。在 CI 環(huán)境下,在開發(fā)過程的早期并且常常是在開發(fā)過程中即將多個開發(fā)人員的代碼集成在一起進行共同測試。這有助于開發(fā)人員在開發(fā)出代碼后不久即可發(fā)現(xiàn)問題,而此時開發(fā)人員對導(dǎo)致問題的代碼還記憶猶新,從而可以更加快速地糾正這些問題。此外,及早發(fā)現(xiàn)問題可防止問題擴大,防止問題變得更復(fù)雜、更難以解決,防止產(chǎn)生更為高昂的問題診斷和解決成本。

由于構(gòu)建和測試應(yīng)用程序的工作會占用大量資源,因此采用 CI 通常意味著采用一種工具來自動進行應(yīng)用程序的構(gòu)建和測試。在互聯(lián)網(wǎng)上快速搜索一下即可發(fā)現(xiàn)眾多的 CI 服務(wù)器,截至本文撰寫之日,有關(guān) CI 的 Wikipedia 文章有不下 35 種服務(wù)器示例!CI 服務(wù)器的工作原理是:等待某種觸發(fā)條件(如定期調(diào)度、開發(fā)人員請求,或者開發(fā)人員向版本控制系統(tǒng)提交代碼),然后執(zhí)行一次應(yīng)用程序的完全構(gòu)建并運行相應(yīng)的測試。使用此方法的項目組通常會遵循一個過程,該過程要求開發(fā)人員至少每天提交一次代碼。如果開發(fā)人員提交的代碼導(dǎo)致 CI 構(gòu)建“中斷”(測試失敗或編譯失?。?,通常會向該開發(fā)人員分派某項非預(yù)期的公共任務(wù)令其完成,從而促使其采取措施以避免構(gòu)建中斷。甚至有一些有點奇特的硬件設(shè)備可公開顯示構(gòu)建狀態(tài),如閃光燈

在這么多可以使用的 CI 服務(wù)器中,您如何進行選擇呢?對于基于 Java 的項目來說,有幾種常見的選擇

  • Cruise Control — 開源、圍繞 Ant 構(gòu)建。常用,但用戶常反映其難以配置、需要編寫配置文件。Cruise Control 又稱為用于 Java 的“原始”CI 工具。
  • Apache Continuum — 開源、用于構(gòu)建 Java 項目。由于它是 Maven 的官方構(gòu)建工具,往往對基于 Maven 的項目提供最好的支持和體驗。其管理和配置通過一個基于 Web 的界面進行。
  • JetBrains Team City — 一種常用的商業(yè) CI 服務(wù)器。Team City 的一個獨有的特性是,它具有針對幾種 IDE 的相應(yīng)插件,這些插件使開發(fā)人員可以在將其更改提交版本控制系統(tǒng)時進行“預(yù)測試”提交 — 使用此功能意味著開發(fā)人員不可能“中斷程序的構(gòu)建”。其管理和配置通過一個基于 Web 的界面進行。
  • Hudson — 開源、原先只支持 CVS 和 Subversion,但現(xiàn)在具有許多插件可支持其他版本控制系統(tǒng)。其管理和配置通過一個基于 Web 的界面進行。

對于本文,我之所以選擇使用 Hudson 有以下兩個原因:第一個原因是,它是一個使用非常廣泛的系統(tǒng),因此,它有著廣大的用戶群和豐富的插件(在本文稍后,您會看到插件是多么有用)。第二個原因是,與 Cruise Control(雖然也是廣泛使用)不同,Hudson 的安裝和配置相當(dāng)容易。

下載和安裝 Hudson



Hudson 被公認為十分易于安裝。Hudson 的下載只是一個 Web 存檔 (WAR) 文件,可從 Hudson 主頁下載(截至本文撰寫之日,最新版本是 1.332)。將該文件存放到一個方便的位置。由于 Hudson 作為 WAR 文件提供,您可將它部署到一個已有的合適的 servlet 容器中。然而,Hudson 自帶了一個集成的 servlet 容器,因此您只需運行 java –jar Hudson.war 命令即可啟動 Hudson。這一功能使我們可以非常輕松地開始運行 Hudson。對于本文,我們不需要特性全面的 servlet 容器可提供的任何安全性或其他特性,因此我們只使用上述命令運行 Hudson。啟動 Hudson 后,即可通過 URL http://<您的主機名>:8080 訪問它。默認安裝不需要用戶登錄,任何人都可以創(chuàng)建、修改或刪除 Hudson 作業(yè),顯然這不適合生產(chǎn)目的。Hudson wiki 有一個頁面描述了如何配置安全性,但在本文中,我們將繼續(xù)使用默認配置,即不受保護的配置。

Hudson 的使用方案



在本文中,我們將配置 Hudson 執(zhí)行以下兩種常用方案:
  • 每當(dāng)開發(fā)人員將更改提交至 Subversion 信息庫時,Hudson 會編譯所有代碼,執(zhí)行 JUnit 測試,然后生成應(yīng)用程序的 WAR 文件。此過程中任何失敗(編譯錯誤或單元測試失?。┒紩?dǎo)致構(gòu)建“中斷”。該構(gòu)建應(yīng)快速執(zhí)行,這樣開發(fā)人員在將更改提交 Subversion 后幾乎可立即得到反饋;為此,我們將不對該作業(yè)執(zhí)行 UI 測試。
  • Hudson 將定期(每天一次)執(zhí)行和上面相同的任務(wù)(編譯、測試、生成),將應(yīng)用程序的 WAR 文件部署到正確配置的 Oracle WebLogic Server,然后運行以前使用 Selenium 創(chuàng)建的 UI 測試(有關(guān)如何使用 Selenium 創(chuàng)建 UI 測試的詳細信息,可以參閱本系列中的 Selenium 一文)。和上一種方案一樣,任何失敗(包括 UI 測試失?。┒紩?dǎo)致構(gòu)建“中斷”。我們還可以手動請求 Hudson 執(zhí)行此方案,這樣我們就不必等到定期調(diào)度時間就可以看到 Hudson 的運行了。

我們將使用本系列較早的文章中開發(fā)的 Oracle Application Development Framework (Oracle ADF) 11g 應(yīng)用程序、單元測試和 UI 測試。如果您沒有跟隨學(xué)習(xí)本系列文章,可以從這里下載源代碼:oracle.com/technology/pub/files/adf-development-essentials-sample.zip。對于本文,我還從 VisualSVN Subversion 信息庫中刪除了“everyone”訪問,要求訪問時提供登錄憑證,這樣我們可以看到其工作方式。如果您這么做,我建議您在 Subversion 服務(wù)器中專門為 Hudson 創(chuàng)建一個用戶,這樣 Hudson 可執(zhí)行的任何操作(如對一個構(gòu)建進行標(biāo)記)將被記錄為由 Hudson 完成。如果您的信息庫是不受保護的,則可跳過這些提供憑證的相關(guān)步驟。

初始構(gòu)建服務(wù)器和 Hudson 配置



為使 Hudson 能夠構(gòu)建我們的應(yīng)用程序并對其進行測試,運行 Hudson 的計算機需要安裝一個 Java Development Kit (JDK)(用于對項目進行編譯)、一個 Ant 安裝(安裝了合適的 Ant 庫以便構(gòu)建 Oracle ADF 11g 應(yīng)用程序),以及運行于同一計算機上的 Selenium RC 服務(wù)器(用于執(zhí)行 UI 測試)。一般來說,Hudson 服務(wù)器不應(yīng)安裝在開發(fā)人員的計算機上,而應(yīng)安裝在一臺專門用于進行 CI 構(gòu)建和測試的計算機上。由于我們已將應(yīng)用程序配置為可通過 Ant 構(gòu)建,并且 Subversion 下具備所有需要的庫,因此不必在 CI 服務(wù)器中安裝 Oracle JDeveloper 11g 的一個副本了。當(dāng)然,為了學(xué)習(xí)的需要,您可以在一臺計算機上安裝所有組件;然而,就本文而言,我將在另一臺計算機(實際上是一個虛擬機)上安裝 Hudson,目的是向我自己證明 CI 服務(wù)器確實不需要安裝 Oracle JDeveloper,并且向您說明新服務(wù)器上需要安裝哪些組件。我的環(huán)境如下所示:

 

開發(fā)人員使用的便攜式計算機 (Windows Vista)
計算機名:jstegema-lap
安裝了 Oracle JDeveloper 11g
安裝了 Oracle Database 11g 和 Visual SVN(用于測試)
CI 服務(wù)器(虛擬機)
計算機名:jstegema-lnx
安裝了 OpenSUSE 11.2RC2 和 Hudson

在 CI 服務(wù)器上,我們需要的第一個組件是能夠運行 Hudson 的 JDK。我的 CI 服務(wù)器上已經(jīng)安裝了一個 JDK,這對于 Hudson 的運行來說是件好事,但作為編譯 Oracle ADF 11g 應(yīng)用程序所使用的 JDK,它稍微有點過時了。盡管 Hudson 能夠自動下載并安裝 JDK 和各種版本的 Ant,但這個過程確實需要進行一點配置。因此,對于本文,我將手動下載并安裝最新的 JDK。而對于 Ant,您可能還記得我們在本系列的 JUnit 一文中講過,需要將一些 JAR 文件從 Oracle JDeveloper 安裝中復(fù)制到 Ant 的 library 目錄中,因此我們無法使用自動安裝功能,必須親自安裝 Ant 并復(fù)制各個庫。

為了安裝 Ant,只需從 Ant 網(wǎng)站下載,將其解壓縮至 CI 服務(wù)器上一個合適的目錄。如 Ant 一文中所述,我們需要從 Oracle JDeveloper 11g 安裝中將 junit.jar 和 ant-weblogic.jar(這些文件在 <安裝目錄>/jdeveloper/ant/lib 下)復(fù)制到您已下載并解壓縮的 Ant 的 lib 目錄中。

下一步是告訴 Hudson 我們打算使用的 JDK 和 Ant 安裝。幸運的是,所有 Hudson 配置都通過一個 Web 界面進行并且相當(dāng)簡單。首先,在瀏覽器中訪問 Hudson URL(默認)并單擊 Manage Hudson 鏈接。然后,在 Manage Hudson 頁面中,單擊 Configure System。在此頁面中,您可以配置 JDK 和 Ant 這兩個安裝。首先,在 JDK 區(qū)域中,單擊 Add JDK 按鈕。取消選中 Install Automatically 復(fù)選框,提供一個易于記憶的名稱(我建議使用 JDK 的版本作為名稱)并提供 JDK 的安裝位置。我的系統(tǒng)上的配置如下所示:



圖 1:JDK 配置

接下來,重復(fù)上述過程以添加一個 Ant 安裝。下面是我的配置:



圖 2:Ant 配置

單擊 Save 按鈕保存該配置?,F(xiàn)在,您創(chuàng)建 Hudson 作業(yè)時即可使用已配置的 JDK 和 Ant 安裝了。
創(chuàng)建一個提交觸發(fā)構(gòu)建和測試的作業(yè)

我們首先創(chuàng)建一個 Hudson 作業(yè),該作業(yè)有以下特點:

  • 觸發(fā):該作業(yè)由 Subversion 信息庫中新提交的更改觸發(fā)
  • 采取的操作:構(gòu)建應(yīng)用程序的 ModelUI 項目,編譯 ModelTests 項目,執(zhí)行 AllOTNAppModuleTests 測試套件
  • 在構(gòu)建和測試之后:發(fā)布 JUnit 測試結(jié)果

此作業(yè)將展示 Hudson 的基本功能。我們建立好該作業(yè)之后,將看一下如何使用 Hudson 的插件在該作業(yè)中添加更多功能。首先,轉(zhuǎn)到 Hudson 主頁,該頁面位于 http://<您的主機名>:8080。我們很容易就可以開始:該 Hudson 頁面中央向您發(fā)出這樣的邀請,“please create new jobs to get started”。此時單擊 create new jobs 鏈接。接著,Hudson 讓您指定作業(yè)名稱并選擇要創(chuàng)建的作業(yè)類型。我們以 Build and Test OTN Trunk 作為該作業(yè)的名稱(我們將從 Subversion 中的“trunk”項目構(gòu)建),該作業(yè)類型為“free-style software project”(用 Hudson 的術(shù)語說)。填入相應(yīng)信息,然后單擊 OK



圖 3:新作業(yè)的信息

在出現(xiàn)的下一個屏幕中,您將進行整個作業(yè)自身的配置。如果您愿意,在所提供的域中為該作業(yè)提供一個說明。在這里,我們并不會對作業(yè)屏幕上的每個選項的用途都加以解釋,而只是看一看為了配置該作業(yè)至少需要哪些選項。為了指定運行 Ant 任務(wù)時使用哪個 JDK,我們將該構(gòu)建配置為 Hudson 中參數(shù)化的構(gòu)建,并添加一個字符串參數(shù)以設(shè)置 JAVA_HOME 參數(shù)的值。為此,選中 This build is parameterized 復(fù)選框,使用下拉列表添加一個名為 JAVA_HOME 的字符串參數(shù),令其值指向您系統(tǒng)中相應(yīng)的 JDK,如下所示:



圖 4:設(shè)置該構(gòu)建作業(yè)的 JAVA_HOME 參數(shù)

我們需要提供的下一項是 Source Code Management (SCM) 信息。由于我們使用 Subversion,因此可單擊 Subversion 單選按鈕查看 Subversion 的相關(guān)選項。我們需要提供的唯一一項信息是我們要從其中進行構(gòu)建的 Subversion URL。提供在您的環(huán)境下該應(yīng)用程序的“trunk”項目的 URL。我這里是 http://hostname/svn/otn/trunk。



圖 5:該作業(yè)的 Subversion URL

從屏幕截圖中可以看出,Hudson 立刻就知道了該 Subversion 信息庫是受保護的。單擊 enter credential 鏈接,提供該信息庫的用戶名和口令。在新打開的窗口中,提供正確信息后單擊 OK。我這里是這樣的:



圖 6:Subversion 身份驗證

接下來,我們需要設(shè)置一個構(gòu)建觸發(fā)器。我們說過我們希望 CI 作業(yè)在開發(fā)人員向 Subversion 提交更改時運行。對此,Hudson 有一個相應(yīng)的選項:Poll SCM。單擊 Poll SCM 復(fù)選框之后,您就可以指定輪詢調(diào)度周期了。以 cron 作業(yè)所使用的格式指定該調(diào)度周期(有關(guān)詳細信息和示例,可單擊該域的 Help 按鈕獲取)。我們讓該作業(yè)每分鐘對新的提交進行一次輪詢,這樣我們就不必等很長時間才能看到系統(tǒng)的反應(yīng)了:



圖 7:SCM 輪詢調(diào)度

接著,添加我們希望 Hudson 在該構(gòu)建過程中執(zhí)行的一些步驟。根據(jù)我們對該作業(yè)的描述,我們希望讓 Hudson 執(zhí)行下列 Ant 任務(wù):

  • model.compile(編譯 Model 項目)
  • viewcontroller.compile(編譯 ViewController 項目)
  • ModelTests.allTests(執(zhí)行 ModelTests 項目的 JUnit 測試套件)

我們來添加第一個構(gòu)建步驟:單擊 Add build step 列表并選擇 Invoke Ant



圖 8:添加一個基于 Ant 的構(gòu)建步驟

然后,您可以從列表中指定要使用的 Ant 版本。由于在我們的項目中有多個 Ant build.xml 文件,我們需要單擊 Advanced 按鈕告訴 Hudson 具體使用哪一個。應(yīng)相對于 Subversion URL 的路徑來指定構(gòu)建文件。因此,要讓 Hudson 在 Model 項目的 Ant build.xml 中執(zhí)行 model.compile 任務(wù),填寫如下信息:



圖 9:針對 model.build Ant 任務(wù)的構(gòu)建步驟

接著,您可以按上述過程對另外兩個 Ant 任務(wù)再添加兩個構(gòu)建步驟。對這兩個任務(wù)的配置如下:



圖 10:剩余的構(gòu)建步驟

配置該作業(yè)的最后一步是設(shè)置作業(yè)的任何構(gòu)建后操作。通過查看各個選項您可以發(fā)現(xiàn),您可以做很多的事情,如向某人發(fā)送電子郵件以讓其知道構(gòu)建狀況,或者發(fā)布 Javadoc。我們關(guān)注的是發(fā)布 JUnit 測試結(jié)果。選中相應(yīng)復(fù)選框,將 JUnit 測試結(jié)果的存放位置告訴 Hudson(同樣,使用相對于 Subversion URL 的路徑,Hudson 需要該路徑以“trunk”開頭):



圖 11:指定測試結(jié)果的位置

現(xiàn)在可單擊 Save 按鈕保存該作業(yè)。Hudson 將首次運行該構(gòu)建作業(yè)。您可以單擊右上角的 ENABLE AUTO REFRESH 鏈接來查看構(gòu)建進度。一旦構(gòu)建開始,您會看到 Build History 小部件開始呈現(xiàn)動畫效果(如果 Hudson 沒有自動啟動構(gòu)建,您始終可以單擊 Build Now 鏈接):



圖 12:構(gòu)建狀態(tài)小部件

如果想監(jiān)視構(gòu)建詳情,可單擊該構(gòu)建的鏈接,然后單擊 Console Output 鏈接以查看輸出。該控制臺視圖還非常有助于您理解構(gòu)建失敗的原因(作業(yè)配置錯誤、編譯失敗等等)。例如,在重復(fù)進行的一次構(gòu)建步驟中,我鍵入了錯誤的 Ant 任務(wù),于是在控制臺視圖中看到以下信息:



圖 13:由于構(gòu)建失敗而產(chǎn)生的控制臺日志

當(dāng)我返回 Hudson Dashboard 頁面時,看到我的作業(yè)狀態(tài)是失?。ㄒ砸粋€大紅球來指示)并且該項目的“天氣狀況”是暴風(fēng)雨:



圖 14:暴風(fēng)雨項目

希望您的第一個構(gòu)建成功進行。一旦您改正了所有可能的錯誤并且構(gòu)建成功,該信息板就開始呈現(xiàn)一個更妥當(dāng)?shù)漠嬅妫?br>


圖 15:更妥當(dāng)?shù)漠嬅?br>
請注意,由于最近存在構(gòu)建失敗,該項目的“天氣狀態(tài)”不會立即轉(zhuǎn)為晴朗。一旦您進行了一連串成功的構(gòu)建,您的項目就會轉(zhuǎn)為晴朗宜人了。您可以單擊 Last Success 或 Last Failure 列中的任何鏈接來查看有關(guān)該構(gòu)建的信息。例如,當(dāng)我單擊上次成功構(gòu)建的相關(guān)鏈接時,出現(xiàn)了有關(guān)該構(gòu)建的狀態(tài)頁面:



圖 16:一個構(gòu)建狀態(tài)頁面

通過該頁面,我可以查看到以下測試結(jié)果:



圖 17:測試結(jié)果

. . 甚至可以下鉆到各個測試:



圖 18:各個測試結(jié)果

要對觸發(fā)構(gòu)建的能力進行測試,您可以在 Oracle JDeveloper 11g 中對應(yīng)用程序進行一次更改后提交該更改。不久之后,您會在 Hudson 信息板中看到,Hudson 發(fā)現(xiàn)了該更改并啟動了構(gòu)建過程:



圖 19:正在進行構(gòu)建

一旦構(gòu)建完成,如果單擊其構(gòu)建號,可以看到一個說明該構(gòu)建由某個 SCM 更改觸發(fā)的指示、開發(fā)人員提供的有關(guān)該次提交的注釋,甚至還可以看到一個 detail 鏈接,該鏈接可顯示出提交者和提交者所更改的文件:



圖 20:構(gòu)建結(jié)果顯示出該構(gòu)建由 SCM 更改啟動

為了能夠運行 UI 測試,首先須將應(yīng)用程序打包到一個企業(yè)存檔 (EAR) 文件,然后將其安裝到 Oracle WebLogic Server 上以便測試。此外,UITests 項目還需要一個運行 UI 測試的 Ant 腳本。對此過程的逐步詳細說明會使本文變得過長,因此我在此概要介紹一下這些步驟:

創(chuàng)建一個構(gòu)建和 UI 測試調(diào)度作業(yè)



如果您有一個進行相應(yīng)配置的 Oracle WebLogic Server 可以使用,您還可以使用這些方法來使用 Ant 和 Hudson 將應(yīng)用程序部署到您的 Oracle WebLogic Server 上并使用 Selenium RC 執(zhí)行 UI 測試。由于設(shè)置和執(zhí)行 UI 測試可能會花費較長時間,多數(shù)人都不會在每次提交到版本控制系統(tǒng)后就調(diào)度執(zhí)行此類作業(yè),而是每天日或定期執(zhí)行這類作業(yè)。本文將介紹如何創(chuàng)建和配置 Ant 腳本和 Hudson 作業(yè)以構(gòu)建該應(yīng)用程序、將其部署于當(dāng)前運行的 Oracle WebLogic Server 并通過 Selenium RC 執(zhí)行 UI 測試。本文不介紹如何配置 Oracle WebLogic Server,但假定您已使用 Oracle ADF 庫正確配置了一個域。為了順利完成本文的學(xué)習(xí),您應(yīng)自我測試一下,看是否能將該應(yīng)用程序部署到 Oracle WebLogic Server 中并通過 Web 瀏覽器訪問它。對于我的測試來說,我在自己的 Linux 虛擬機上安裝了 Oracle WebLogic Server 和所需的 Oracle ADF 庫。

 

  • 創(chuàng)建一個名為 build 的新項目以存放所有應(yīng)用程序級的構(gòu)建構(gòu)件。
  • 為該構(gòu)建項目創(chuàng)建一個 Ant 構(gòu)建腳本。
  • 在該 Ant 構(gòu)建腳本中添加一個 build.ear 目標(biāo)以生成應(yīng)用程序的 EAR 文件。使用對 WAR 文件所使用的技術(shù)(用 Oracle JDeveloper 生成并解壓縮以發(fā)現(xiàn)其結(jié)構(gòu))。
  • 在該 Ant 構(gòu)建腳本中添加一個 build.deploy 目標(biāo)以獲取該 EAR 文件并將其部署到 Oracle WebLogic Server。Oracle WebLogic Server 包含一個名為 wldeploy 的 Ant 任務(wù)(有助于完成此任務(wù)),另外,此博客文章還介紹了一個無需首先運行 Oracle WebLogic Server 環(huán)境腳本即可使用此任務(wù)的方法。
  • 為 UITests 項目創(chuàng)建一個 Ant 構(gòu)建腳本。添加一個執(zhí)行 UI 測試的任務(wù)(正確關(guān)聯(lián)到 build.deploy 目標(biāo))。
  • 將所有更改的代碼提交給 Subversion,以便 Hudson 可以訪問。

完成上述準(zhǔn)備步驟后,您就可以創(chuàng)建該 Hudson 作業(yè)了。對該 Hudson 作業(yè)的配置十分類似于對您創(chuàng)建的第一個作業(yè)的配置,只是有以下不同:

  • 應(yīng)調(diào)度該作業(yè)定期地,例如每天一次地執(zhí)行,或者根據(jù)需要調(diào)度執(zhí)行,而不是輪詢 SCM。

         

            圖 21:每天午夜時分執(zhí)行該作業(yè)

  • 該作業(yè)包含一個構(gòu)建步驟(執(zhí)行 UI 測試)。

                   

  圖 22:針對 UI 測試的構(gòu)建步驟

  • 該 JUnit 測試的結(jié)果將保存在另一個目錄中。

                   

  圖 23:發(fā)布 UI 測試結(jié)果

創(chuàng)建該作業(yè)之后,確保 Oracle WebLogic Server 和 Selenium RC 啟動(如果愿意,可以在 Ant 任務(wù)中添加步驟以啟動它們),然后執(zhí)行該作業(yè)。如果您觀察構(gòu)建服務(wù)器,最終會看到一個瀏覽器窗口彈出(這是 Selenium RC 所為)并執(zhí)行 UI 測試。如果一切正常,您會看到在 Hudson 信息板中出現(xiàn)了兩個“晴朗的”項目:



圖 24:兩個“晴朗的”項目!

總結(jié)

現(xiàn)在,您已具備了所有相應(yīng)工具,能夠以團隊的形式有效地開發(fā) Oracle ADF 應(yīng)用程序,能夠使項目構(gòu)建通過 Ant 自動進行、使單元測試通過 JUnit 自動進行、使 UI 測試通過 Selenium 自動進行,并能夠通過 Hudson 對您的應(yīng)用程序進行持續(xù)的集成和測試了。希望您覺得這些文章對您有所幫助。

致謝

特別感謝 Timo Hahn 的幫助。起先我的應(yīng)用程序在 Oracle JDeveloper 環(huán)境中運行良好但在獨立 Oracle WebLogic Server 上不能運行,他通過 OTN JDeveloper 和 ADF 論壇(很棒的論壇)幫助我進行調(diào)試,找出了其中的原因。請您記住,OTN JDeveloper 和 ADF 論壇是一個很棒的論壇,在那里,您既可以尋求幫助(記住首先要搜索一下)又可以幫助他人。

John Stegeman (http://stegemanoracle.) 是 Cambridge Solutions(一家跨國 BPO 和 IT 服務(wù)公司)的 EMEA 地區(qū)的 Oracle ACE 總監(jiān)(Oracle 融合中間件)兼首席架構(gòu)師。他從 1990 年開始就使用 Oracle 產(chǎn)品工作,從版本 3 開始就使用 Oracle JDeveloper 了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    神马午夜福利一区二区| 国产精品十八禁亚洲黄污免费观看| 日韩日韩日韩日韩在线| 亚洲中文字幕人妻系列| 九九九热视频最新在线| 美女露小粉嫩91精品久久久| 国产亚洲欧美日韩精品一区| 精品国模一区二区三区欧美| 九九热这里只有精品视频| 粉嫩国产美女国产av| 色哟哟在线免费一区二区三区| 日韩精品区欧美在线一区| 日本欧美视频在线观看免费| 99精品国产自在现线观看| 中文字幕亚洲在线一区| 欧美一区日韩一区日韩一区| 91欧美亚洲精品在线观看| 亚洲在线观看福利视频| 亚洲欧美日韩中文字幕二欧美 | 欧美日韩久久精品一区二区| 老司机精品在线你懂的| 日韩专区欧美中文字幕| 粗暴蹂躏中文一区二区三区| 69老司机精品视频在线观看| 久久精品少妇内射毛片| 午夜精品久久久免费视频| 五月天婷亚洲天婷综合网| 日韩专区欧美中文字幕| av在线免费观看一区二区三区| 国产精品十八禁亚洲黄污免费观看| 日本欧美一区二区三区在线播| 精品一区二区三区不卡少妇av| 久热99中文字幕视频在线| 国产精品福利一二三区| 欧美日韩国产黑人一区| 欧美国产精品区一区二区三区| 亚洲最新的黄色录像在线| 色婷婷激情五月天丁香| 国产精品白丝久久av| 欧美日韩一级黄片免费观看| 国产一区二区三区色噜噜|