制備
讓自己有一些配置的心情。 您已經安裝了最新的NetBeans 7.1 ,并且將在一秒鐘內下載WebLogic 12c ZIP發行版。 下載wls1211_dev.zip后,將其放到所選位置并解壓縮。 從現在開始,我們將這個文件夾稱為%MW_HOME%文件夾。 打開命令行并在其中設置%JAVA_HOME%,%JAVA_VENDOR%和%MW_HOME%變量:
set JAVA_HOME=D:\jdk1.7.0_04
set MW_HOME=D:\temp\wls12zip
set JAVA_VENDOR=Sun
完成此步驟后,最后一步是在MW_HOME目錄中運行安裝配置腳本configure.cmd。 這是一次性的事情。
設置您的WebLogic域
接下來,我們需要一個WebLogic域。 打開一個新的命令行提示符。 通過運行%MW_HOME%\ wlserver \ server \ bin \ setWLSEnv.cmd腳本在當前Shell中設置環境。 執行%MW_HOME%\ wlserver \ common \ bin \ config.cmd,然后按照向導在您選擇的文件夾(例如D:\ temp \ test-domain)中創建一個名為test-domain的基本WebLogic Server域。 輸入您選擇的用戶名和密碼(例如system / system1),然后單擊向導,直到您在其下的“完成”按鈕為止。 WebLogic需要Derby客戶端jar文件才能配置和使用數據庫。 將derbyclient-10.8.2.2.jar從m2存儲庫復制到test-domain \ lib文件夾。 現在,通過運行新創建的域目錄中的startWebLogic.cmd,手動啟動新創建的域。 導航到http:// localhost:7001 / console并使用上面的憑據登錄,以驗證一切是否正常運行。 導航到“服務>數據源”,然后從表上方選擇“新建”按鈕。 選擇一個“通用數據源”并輸入您選擇的名稱(例如GalleriaPool),然后輸入jdbc / galleriaDS作為JNDI名稱。 選擇Derby作為數據庫類型,然后單擊“下一步”。 選擇Derby的驅動程序(類型4),然后單擊“下一步”和“下一步”,然后輸入連接屬性(數據庫:GALLERIATEST,主機:localhost。用戶名和密碼:APP”,然后單擊“下一步”。如果需要,可以單擊單擊頂部的“測試配置”按鈕,并確保所有設置均以正確的方式進行。
接下來是最棘手的部分。 我們需要像為GlassFish配置的那樣的JDBC領域。 這里的第一個區別是,我們實際上并沒有創建一個新的領域,而是向可用的領域添加了一種身份驗證機制。 WebLogic有一個令人討厭的限制。 您可以配置任意多個安全領域,但在給定時間只能激活一個。 這讓我停了一會兒,直到我從Michel Schildmeijer得到了小費(謝謝,順便說一句!)。 導航到“安全領域”,然后從表中選擇“ myrealm”。 切換到提供程序選項卡。 選擇身份驗證提供者表格上方的“新建”。 輸入“ GalleriaAuthenticator”作為名稱,然后從下拉框中選擇“ SQLAuthenticator”作為類型。 單擊確定。 選擇GalleriaAuthenticator并設置控制標志:SUFFICIENT并保存。 之后,切換到“提供商特定”選項卡。 輸入以下內容:
Data Source Name: GalleriaPool
Password Style Retained: unchecked
Password Algorithm: SHA-512
Password Style: SALTEDHASHED
SQL Get Users Password: SELECT PASSWORD FROM USERS WHERE USERID = ?
SQL Set User Password: UPDATE USERS SET PASSWORD = ? WHERE USERID = ?
SQL User Exists: SELECT USERID FROM USERS WHERE USERID = ?
SQL List Users: SELECT USERID FROM USERS WHERE USERID LIKE ?
SQL Create User: INSERT INTO USERS VALUES ( ? , ? )
SQL Remove User: DELETE FROM USERS WHERE USERID = ?
SQL List Groups: SELECT GROUPID FROM GROUPS WHERE GROUPID LIKE ?
SQL Group Exists: SELECT GROUPID FROM GROUPS WHERE GROUPID = ?
SQL Create Group: INSERT INTO GROUPS VALUES ( ? )
SQL Remove Group: DELETE FROM GROUPS WHERE GROUPID = ?
SQL Is Member: SELECT USERID FROM USERS_GROUPS WHERE GROUPID = ? AND USERID = ?
SQL List Member Groups: SELECT GROUPID FROM USERS_GROUPS WHERE USERID = ?
SQL List Group Members: SELECT USERID FROM USERS_GROUPS WHERE GROUPID = ? AND USERID LIKE ?
SQL Remove Group Memberships: DELETE FROM USERS_GROUPS WHERE GROUPID = ? OR GROUPID = ?
SQL Add Member To Group: INSERT INTO USERS_GROUPS VALUES( ?, ?)
SQL Remove Member From Group: DELETE FROM USERS_GROUPS WHERE GROUPID = ? AND USERID = ?
SQL Remove Group Member: DELETE FROM USERS_GROUPS WHERE GROUPID = ?
Descriptions Supported: unchecked
保存您的更改。 然后返回“提供商”標簽。 單擊“重新排序”按鈕,然后將GalleriaAuthenticator推到列表頂部。 完成后單擊“確定”,然后停止您的WebLogic實例。 您可以隨時重新啟動它。
配置您的項目
Java EE是可移植的。 對。 而且,您應該能夠在不對WebLogic 12c進行任何更改的情況下運行相同的部署。 那是理論。 實際上,您將不得不接觸部署。 因為WebLogic的Hibernate存在一些問題。 而且,與GlassFish相比,部署方面的問題要復雜得多。 首先,您必須創建一個“ galleria-ear \ src \ main \ application \ META-INF”文件夾。 將空白的weblogic-application.xml放入其中,并在其中放入以下代碼:
<?xml version='1.0' encoding='UTF-8'?>
<weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.4/weblogic-application.xsd"><prefer-application-packages><package-name>antlr.*</package-name></prefer-application-packages>
</weblogic-application>
這告訴WebLogic與服務器中已經存在的庫相比,更喜歡應用程序打包的庫。 讓我們繼續。 我們需要將Hibernate依賴項添加到耳朵。 使用GlassFish,我們跳過了這一步,因為我們在服務器上安裝了Hibernate軟件包。 開始了。 打開galleria-ear pom.xml并將以下內容添加到“依賴項”部分:
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>4.0.1.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.0.1.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.2.0.Final</version></dependency><dependency><groupId>org.jboss.logging</groupId><artifactId>jboss-logging</artifactId><version>3.1.0.CR2</version></dependency>
您還需要查看maven-ear-plugin并將以下內容添加到<configuration>:
<defaultLibBundleDir>lib</defaultLibBundleDir>
如果已經存在,請刪除commons編解碼器jarModule。 它沒有問題,但已打包到ear / lib文件夾中,因此您可以跳過它。
接下來,導航到galleria-jsf項目并打開web.xml。 <login-config>不完整,應如下所示:
<login-config><auth-method>FORM</auth-method><form-login-config><form-login-page>/Login.xhtml</form-login-page><form-error-page>/Login.xhtml</form-error-page></form-login-config></login-config>
<security-role><description>All registered Users belong to this Group</description><role-name>RegisteredUsers</role-name></security-role>
您還需要定義可能的角色,否則WebLogic安全性內容將開始抱怨。
將一個空白的weblogic.xml添加到galleria-jsf \ src \ main \ webapp \ WEB-INF文件夾中,并添加以下幾行:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"><security-role-assignment><role-name>RegisteredUsers</role-name><principal-name>RegisteredUsers</principal-name></security-role-assignment> <session-descriptor><timeout-secs>3600</timeout-secs><invalidation-interval-secs>60</invalidation-interval-secs><cookie-name>GalleriaCookie</cookie-name><cookie-max-age-secs>-1</cookie-max-age-secs><url-rewriting-enabled>false</url-rewriting-enabled></session-descriptor>
</weblogic-web-app>
我們在這里將web.xml角色映射到WebLogic角色。 您可能已經跳過了這個,但是我喜歡這種方式,所以您不會感到困惑。 session-descriptor元素負責JSESSION cookie名稱。 如果您不進行更改,則會遇到登錄用戶登錄管理控制臺的麻煩。
繼續執行galleria-ejb項目。 在“ galleria-ejb \ src \ main \ resources \ META-INF”文件夾中創建一個空白的weblogic-ejb-jar.xml。 將以下代碼放入其中:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-ejb-jar xmlns="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar http://xmlns.oracle.com/weblogic/weblogic-ejb-jar/1.0/weblogic-ejb-jar.xsd"><security-role-assignment><role-name>RegisteredUsers</role-name><principal-name>RegisteredUsers</principal-name></security-role-assignment>
</weblogic-ejb-jar>
與web.xml / weblogic.xml相比,這還告訴WebLogic如何將ejb-jar.xml安全角色映射到WebLogic角色。 好的,打開persistence.xml并添加以下行:
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" /><property name="hibernate.transaction.jta.platform"value="org.hibernate.service.jta.platform.internal.WeblogicJtaPlatform" />
第一個明確選擇用于休眠的Derby方言。 第二個告訴Hibernate在何處以及如何查找事務。 全做完了。 現在,您應該能夠再次構建項目并進行部署。 使用管理控制臺或NetBeans進行部署。 感謝您抽出寶貴時間關注這篇冗長的帖子。 希望對您有所幫助!

是否想知道啟動和運行單元和集成測試所需的時間? 繼續閱讀!
是時候繼續Vineet的Java EE 6 Galleria示例了。 經過一番介紹之后 ,GlassFish和WebLogic 12c部署的基本入門指南終于可以開始進行測試了。 由于兩個原因,我在前面的文章中跳過了這一部分。 第一個顯然是我想寫一篇單獨的文章。 第二個是需要做的工作才能在最新的GlassFish 3.1.2上啟動并運行它。 Vineet和團隊在幾天前發布Arquillian GlassFish Remote Container CR3方面做得很出色,現在還涵蓋了GlassFish 3.1.2。 是時候開始測試Galleria示例了。
你要測試什么
構建Galleria的目的是通過使用JUnit 4編寫的單元測試和集成測試來實現全面的測試覆蓋。EJB和域模型的單元測試和集成測試依賴于EJB 3.1容器API。 表示層的集成測試依賴于Arquillian項目及其Drone擴展(用于執行Selenium測試)。
請確保更新到Galleria項目的最新資源,因為Vineet已將Arquillian GlassFish容器更新為CR3,并將Selenium內容更新為支持最新的FireFox瀏覽器。
單元測試域層
域層的測試分為五類。 前三個(Bean驗證測試,相互注冊驗證測試,構造函數測試,等于和哈希碼方法)涵蓋了幾乎所有基于JPA的應用程序的基本需求。 如果您沿著galleria-ejb \ src \ test源代碼漫步,則可以在info.galleria.domain包中看到它們。 每個域對象都包含一個套件類,該套件類包括所有三種單元測試。
讓我們從查看Bean驗證測試開始。 與JavaBeans屬性中的getter和setter關聯的行為非常容易驗證。 所有需要做的就是首先調用setter,然后調用getter,并驗證getter返回的實例是否等于傳遞給setter的實例。 該項目使用
為此,可以使用BeanVerifier類(在galleria-ejb模塊的src / tests / java根目錄下)。 AlbumBeanVerifier測試只是一個參數化測試,它測試每個屬性。 在這種情況下,唯一的例外是coverPhoto屬性,該屬性具有簡單的JavaBean模式之外的特殊行為。
列表的下一個是對構造函數,equals和hashcode方法的測試。 僅通過創建類的新實例,同時聲明將由構造函數設置的屬性的有效性來測試域實體的構造函數。 equals和hashcode方法通過使用EqualsVerifier項目中的EqualsVerifier類進行驗證。

最基本的測試的最后一類是相互注冊 (PDF)驗證測試。 您只想檢查對實體之間關系的修改是否實際上導致對父屬性和子屬性的更改。 有關實現的更多詳細信息,請參見綜合Wiki頁面 。 所有這些都在單元測試階段執行,并被** / * Suite.java類覆蓋。
除了基本測試,您還會發現針對基本測試模型不足或不適合的特定情況編寫的一次性測試。 在這種情況下,一次性測試將通過手寫斷言來驗證這種行為。 您可以在同一包的** / * Tests.java類中找到它們。
域層測試以JPA存儲庫測試結束。 * RepositoryTest.java類中的每個類都會測試已處理域對象的CRUD行為。 通用的AbstractRepositoryTest會處理測試數據,并在每次測試運行后重置數據庫。 數據庫創建本身由maven-dbdeploy-plugin處理。 查看pom.xml,您可以看到它綁定到兩個Maven生命周期階段(流程測試資源和集成前測試),以確保兩次被調用。 第一次是在單元測試之前,第二次是在集成測試之前(請在下面進行比較)。
所有這些單元測試都是通過surefire執行的。 如果您在galleria-ejb項目上發布了mvn測試,則可以看到總共138個測試通過了。 這是四個** / * Suite測試,四個** / * RepositoryTest和兩個附加測試。 如果您簡要查看控制臺輸出,就會發現這一切都是在Java SE環境中發生的。 到目前為止,尚未進行任何容器測試。
集成測試域層
因此,這實際上僅涵蓋了每個人都應該做并且可能知道的基礎知識。 進行集成測試是另一回事。 這是通過** / * IntegrationSuite測試完成的。 該名稱故意不使用默認命名約定,以防止它們在Maven的單元測試階段中運行。 要進入Maven的集成測試階段,Galleria示例將使用Maven故障安全插件 。 您可以在info.galleria.service.ejb包中找到集成測試套件。 AbstractIntegrationTest注意處理單元測試的測試數據(與AbstractRepositoryTest相當)。 該套件為每個域對象都包含一個* ServiceIntegrationTest。 您可以遍歷每個* IntegrationTest中的單個測試,并了解這里發生的事情。 ServicesIntegrationSuite通過使用AbstractIntegrationTest.startup();來啟動和停止EJBContainer。 這種方法比較不明顯且簡單:
logger.info("Starting the embedded container.");
Map<String, Object> props = new HashMap<String, Object>();
props.put("org.glassfish.ejb.embedded.glassfish.installation.root","./glassfish-integrationtest-install/glassfish");
container = EJBContainer.createEJBContainer(props);
context = container.getContext();
datasource = (DataSource) context.lookup("jdbc/galleriaDS");
這里最重要的一點是,可嵌入的EJBContainer是通過現有的GlassFish域配置的,該域可以直接在galleria-ejb \ glassfish-integrationtest-install文件夾中找到。 如果查看glassfish \ domains \ domain1 \ config \ domain.xml,可以看到,所有配置都已經為您完成。 但是,部署來自何處? 這很容易回答。 默認情況下,可嵌入的EJBContainer在您的類路徑中搜索ejb-jar jarfiles或文件夾,然后將其部署。 如果要從EJBContainer中看到更多詳細輸出,則必須在src / test / resources中提供一個customlogging.properties文件,并在其中添加一些簡單的行:
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.level=FINEST
#add some more packages if you need them
info.galleria.service.ejb.level=FINE
將以下內容添加到pom.xml的maven-failsafe-plugin配置部分:
<systemPropertyVariables>
<java.util.logging.config.file>${basedir}/src/test/resources/customlogging.
properties</java.util.logging.config.file>
</systemPropertyVariables>
集成測試應成功完成,并且maven應打印與以下內容類似的內容:
Tests run: 49, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 61.726 sec
注意,集成測試花費的時間比正常的單元測試長得多。 這一點也不奇怪,您應該確保僅在需要時才執行它們,以免影響開發進度。
集成測試表示層
域層覆蓋了測試。 缺少的是表示層。 您可以在galleria-jsf項目中找到表示層測試。 首先檢查pom.xml。 您可以在這里找到幾個新的依賴項。 即Arquillian,Selenium和Drone。
首先再次進行一些配置。 向下滾動到配置文件部分,您可以看到一個集成測試配置文件,該配置文件使用了maven-glassfish-plugin并控制了一個配置有幾個屬性的容器。 將定義添加到pom頂部的properties部分:
<galleria.glassfish.testDomain.user>admin</galleria.glassfish.
testDomain.user>
<galleria.glassfish.testDomain.passwordFile>D:/glassfish-3.1.2-b22/glassfish3/glassfish/domains/
test-domain/config/local-password</galleria.glassfish.testDomain.passwordFile>
<galleria.glassfish.testDomain.glassfishDirectory>D:/glassfish-3.1.2-b22/glassfish3/glassfish/</galleria.glassfish.testDomain.glassfishDirectory>
<galleria.glassfish.testDomain.domainName>test-domain</galleria.glassfish.testDomain.domainName>
<galleria.glassfish.testDomain.adminPort>10048</galleria.glassfish.testDomain.adminPort>
<galleria.glassfish.testDomain.httpPort>10080</galleria.glassfish.testDomain.httpPort>
<galleria.glassfish.testDomain.httpsPort>10081</galleria.glassfish.testDomain.httpsPort>
您可以按照第2部分中所述從galleria-ejb項目的開發配置文件中復制它。 您還應該已經擁有該域。 接下來是maven-surefire-plugin,您可以看到它遵循了galleria-ejb項目相同的約定。 但是查看測試類,您會發現這里沒有單個單元測試。 因此,您可以直接轉到處理集成測試的maven-failsafe-plugin。 只有一個AllPagesIntegrationTest涵蓋了完整的測試。 讓我們去那里。
這是一個Arquillian Testcase,它作為客戶端針對遠程實例執行。 除了部署的定義(@Deployment),您還會再次看到幾個setUp和tearDown方法,它們可以進行一些初始化和銷毀??。 一件事必須單獨處理。 您還會在其中看到一個writeCoverageData()方法,該方法顯然連接到某種Socket并從中讀取數據。 這是JaCoCo (Java代碼覆蓋率庫)鉤子,可以產生測試的覆蓋率數據集。 要進行此工作,您將必須下載該軟件包并將其解壓縮到您選擇的位置。 接下來轉到GlassFish test-domain \ config \ domain.xml并將其打開。 找到服務器配置– java-config并在其中添加以下內容:
<jvm-options>-javaagent:D:\path\to\jacoco-0.5.6.201201232323\lib\jacocoagent.jar=output=tcpserver</jvm-options>
這將啟用GlassFish的覆蓋代理。 現在完成所有配置。 返回到NetBeans,選擇集成測試配置文件(在NetBeans中,您可以通過從圖標區域中的小錘子旁邊的下拉框中選擇條目,或者使用-Pintegration-test作為maven命令行開關來執行此操作。輸出告訴您,GlassFish域已啟動,并且info.galleria.view.AllPagesIntegrationTest正在運行,請注意,在此運行期間將彈出FireFox實例,而Arquillian Drone擴展正在驅動您的Selenium測試。

如果您以前從未看過,以這種方式遠程控制的瀏覽器看起來很奇怪。 如果一切正常,您現在應該在控制臺輸出中看到以下內容:
Tests run: 30, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 138.014 sec
如果您在瀏覽器中使用的語言環境不是en,則測試可能會完全失敗。 因此,還需要配置Drone以支持它 。 Drone允許您通過arquillian.xml指定Firefox配置文件。 您可以創建一個Firefox配置文件,該配置文件配置為發送以en / en-US作為值的接受語言標頭。

要創建新的配置文件,請使用以下命令啟動Firefox配置文件管理器(您可能需要關閉所有正在運行的實例):firefox -profilemanager(在Windows上,您需要執行命令“ d:\ complete \ path \ to \ firefox.exe” “ -profilemanager)在cmd外殼中。 記住創建此配置文件的光盤上的位置–以后將需要它。 要配置創建的配置文件,在Firefox中,轉到選項(菜單)->內容(選項卡)->語言(字段集)->選擇添加英語(并將其移至頂部,作為首選語言)。 現在瀏覽Galleria-jsf \ src \ test \ resources \ arquillian.xml,然后可以添加一個屬性:
<extension qualifier="webdriver">
<property name="implementationClass">org.openqa.selenium.firefox.FirefoxDriver</property>
<property name="firefoxProfile">location of the Firefox profile for English</property>
</extension>
現在全部完成。 您現在應該可以運行完整的清理和構建過程,而沒有任何測試失敗。 一個大的“綠色酒吧” :)
參考: Java EE 6示例–在WebLogic 12上運行Galleria –第3部分 , Java EE 6示例–測試Galleria –第4部分,來自Markus Eisele博客上的JCG合作伙伴 Markus Eisele。
翻譯自: https://www.javacodegeeks.com/2012/04/java-ee-6-example-galleria-part-2.html