java8實戰
『壹』 實戰|java 測試覆蓋率 Jacoco 插樁的不同形式總結和踩坑記錄
本文為霍格沃茲測試學院優秀學員對 Jacoco 的總結和對使用過程中可能遇到的坑點記錄。測試開發進階學習,文末加群。
一、概述
測試覆蓋率是老生常談的話題。本文主要關注Java後端的測試覆蓋率。由於歷史原因,公司基本不做單元測試(UT),因此我們更關心手工執行、介面執行(人工使用Postman等)、介面自動化、WebUI自動化對應用系統的覆蓋度。
盡管Jacoco已流行多年,各種文檔和帖子描述得很詳細,但大多數文章都是針對特定形式的總結和使用方法。負責整個公司項目的覆蓋率任務的人們需要一一研究和應對,經歷多次入坑、出坑。
今年上半年負責公司不同類型的項目覆蓋率統計技術的適配,對不同形式的項目有了一定的了解,記錄下來,希望對他人有所幫助。本文由個人能力有限、表達能力有限所寫,如有錯誤,歡迎指正。
二、投入覆蓋率之前的思路
了解了Jacoco的部分機制,知道它提供了許多強大的功能,以滿足不同形式的項目需求。Jacoco提供了API,可以屏蔽不同類型項目帶來的困擾。
官方API示例地址:Jacoco.org/Jacoco/trunk...
使用API進行操作的好處包括:
- 屏蔽不同方式的構建部署。若想將此功能集成到平台中,API無疑是很好的方式。
- 只需將Jacoco插樁到測試伺服器上,暴露TCP IP和埠,剩餘提取代碼執行數據、生成覆蓋率報告,就可以統一方式執行。
- Jacoco官方提供了Maven插件方式、Ant的XML方式,均有對應的mp和report進行覆蓋率數據的mp和報告生成。
三、項目梳理
公司是個老牌公司,項目雜亂無章,技術五花八門,至今仍有使用JDK6的項目。影響Jacoco使用過程的因素可能包括:
- JDK版本:公司使用JDK6、7、8,JDK6是個分水嶺,其他版本基本可用JDK8適配。
- 構建方式:Maven構建、ANT構建,也有使用Gradle的可能。
- 啟動方式:Java -jar啟動、通過命令行啟動、使用Tomcat啟動WAR包(打包方式靈活)。
- 部署場景:線上部署、測試部署、開發部署可能採用不同方式,開發者多傾向於使用插件方式啟動,因為快速且集成IDE。
四、Jacoco插樁的本質
Jacoco介入部署過程的本質是插樁,可以是編譯時插樁或運行時插樁。選擇on-the-fly模式。
本質在於,在應用啟動過程中,讓Jacoco相關工具介入部署過程,即介入class文件的載入,在載入class時動態改變位元組碼結構,插入Jacoco的探針。以TCPserver方式進行插樁,應用啟動時在埠上開啟TCP服務,接收執行覆蓋率信息並保存。提供API連接TCP服務,進行覆蓋率數據的mp操作。
五、不同形式的插樁配置
介入啟動過程需要一個jar包:Jacocoagent.jar。配置需要介入的jar包路徑、過濾class文件、TCPserver埠號、訪問地址等。針對不同啟動方式,需要在相應的啟動參數中加入配置,如在java命令、war包啟動、Maven命令、ANT構建、Java -jar啟動時加入相應的配置參數。
六、注意事項匯總
在配置過程中,需注意埠管理、變數作用域、代碼適配性等問題,確保配置的正確性和兼容性。
七、說給想做平台的你
對於想做增量覆蓋率的平台,需要自動化配置,集成devops平台,規劃埠,使用API進行數據收集,確保不同啟動方式的兼容性。
八、一些坑
在配置Ant構建時,確保compile階段配置正確,避免數據無法注入。在多伺服器部署負載均衡時,需要循環連接不同伺服器的IP:port進行數據收集。確保編譯環境的一致性,可以使用sftp下載代碼。注意數據的及時保存和收集,防止覆蓋率數據丟失或不準確。
九、補充API相關代碼覆蓋率數據的獲取
可以封裝覆蓋率數據生成報告時所需的屬性,如數據文件、源碼、class文件等,生成報告時自動獲取這些信息。若需要具體實現代碼示例或獲取更多代碼,請參閱GitHub倉庫。
十、總結
本文是對Java端覆蓋率探索的細化總結,參考了相關資料和課程。期待與大家分享和探討,共同進步。
『貳』 Java Web開發實戰—Listener詳解—Listener簡介、Listener開發、Listener的API、Listener應用
深入探索Java Web開發實戰:Listener的奧秘
在Java Web開發的世界裡,Listener扮演著至關重要的角色,它如同後台的觀察者,默默地監聽並響應Web應用程序中的各種關鍵事件。本篇文章將帶你走進Listener的世界,從基礎概念、開發實踐到API應用,一一詳解。
Listener基礎與機制
Listener的核心在於其監聽機制,它通過8種介面監聽Web應用中的ServletContext、HttpSession和ServletRequest事件。在Eclipse中,只需選擇對應的介面,如默認的javax.servlet.ServletContextListener,即可創建Listener,如TestListener01,它將自動配置到web.xml中,確保監聽器的執行順序。
創建Listener實戰
- 在Eclipse中,選擇Listener介面,如TestListener01,勾選後自動生成相應的類,Eclipse會自動在web.xml中添加和元素,支持多Listener配置。
Listener介面詳解
Java EE提供了一系列強大的Listener介面,如ServletContextListener關注ServletContext的生命周期,而則關注屬性的增刪改。重點掌握這兩大介面,如contextInitialized和contextDestroyed,分別在ServletContext創建和銷毀時觸發。
示例代碼展示
- contextInitialized(ServletContextEvent): 當ServletContext創建時,執行TestListener01的初始化邏輯,控制台輸出"ServletContext對象被創建了"。
- contextDestroyed(ServletContextEvent): ServletContext銷毀時,執行銷毀邏輯,控制台輸出"ServletContext對象被銷毀了"。
後續的Listener介面如HttpSessionListener和ServletRequestListener同樣具有類似的生命周期方法,如sessionCreated(HttpSessionEvent)和requestInitialized(ServletRequestEvent),它們各自負責監聽和操作相應的生命周期事件。
Listener應用實戰
例如,我們可以創建一個名為TestListener09的類,繼承HttpSessionBindingListener,用於存儲用戶信息。結合UserInfo單例模式,實現在線用戶的管理。在Servlet中,監聽用戶登錄和登出事件,實時更新顯示信息。
小結與提升
通過理解Listener的原理和使用方法,你能靈活地編寫程序實現Web應用的特殊功能,如用戶登錄狀態管理、會話統計等。在Context的jsp目錄中,實踐這些Listener的應用,例如,jsp01.jsp通過JSTL展示用戶信息,Servlet08的刪除操作則觸發TestListener09中的清理邏輯。重啟Tomcat,一步步見證Listener的力量。
總而言之,掌握Listener是Java Web開發不可或缺的一部分,它能讓你的應用更為智能,更加靈活。深入理解Listener的介面、機制和應用,將為你的Web開發之路增添無限可能。