測試和發現模組之間耦合的有效手段
雖然我們使用SpringBoot實現微服務,但是在一個微服務中還是有可能塞入很多模組;同時從單體向微服務過程中,只有先將單體切分成模組以後,這些模組之間的依賴越來越少,這些模組才能逐個獨立成微服務。
有沒有一個有效手段在當前單體架構下發現模組之間的依賴關係?發現了模組的依賴關係,如果依賴關係很多那麼我們進行模組重構,也許這兩個模組應該合併成一個模組,或者重構成了單線依賴,這樣兩個模組的依賴達到理想程度,可以變成了兩個微服務了。
這個@Modulith類似於SpringBoot的@SpringBootApplication,如果使用SpringBoot,可以一起註釋:
第二步,com.abc下有兩個子包,假設是com.abc.a和com.abc.b,這裡我們先假設一個情況,假設com.abc.a包下面的MyComponentA依賴於com.abc.b包下面的MyComponentB,我們這個工具是否可以檢測出這種依賴呢?
com.abc.a包下面的MyComponentA:
下面是com.abc.b包下面的MyComponentB:
第三步,我們這個工具是透過測試環節編寫測試用例才能檢測出這樣的依賴,我們知道在正常情況下,當我們啟動SpringBootAplication時,Spring會掃描@Component元註解,然後一股腦子打入Jar包,這裡MyComponentA MyComponentB都標註了@Component,所以肯定會打包在一起,我們的工具特別之處在於,會只掃描com.abc.a子模組包或com.abc.b子模組包,不需要你任何配置,只要在測試類上標註一個註解:@ModuleTest
比如我們在com.abc.a下建立一個測試類:
當執行上面這個測試時,SpringBoot會報錯:
Parameter 0 of constructor in com.abc.a.MyComponentA required a bean of type 'com.abc.b.MyComponentB' that could not be found.
因為MyComponentA依賴於MyComponentB,而MyComponentB在com.abc.b這個子包(模組)下,而這個模組並沒有被測試類載入,所以沒有發現該模組下MyComponentB。
報這個錯誤說明兩個模組之間有依賴,如果報錯越多,說明依賴越多,這時候需要重構了,如果只有一處依賴,我們可以使用Spring的event機制來替代這種直接呼叫,也可以透過第三方服務註冊器進行發現呼叫。
有沒有一個有效手段在當前單體架構下發現模組之間的依賴關係?發現了模組的依賴關係,如果依賴關係很多那麼我們進行模組重構,也許這兩個模組應該合併成一個模組,或者重構成了單線依賴,這樣兩個模組的依賴達到理想程度,可以變成了兩個微服務了。
https://github.com/olivergierke/moduliths提供了這樣一個測試和發現模組之間依賴耦合的有效工具。
假設我們在一個包com.abc下面有兩個子包com.abc.a和com.abc.b。 那麼這兩個子包是不是兩個獨立模組?依賴關係如何?
首先我們要使用@Modulith在com.abc這個根包下一個入口類裡面註解一下:
package com.abc; @Modulith public class Application { } <p class="indent"> |
這個@Modulith類似於SpringBoot的@SpringBootApplication,如果使用SpringBoot,可以一起註釋:
@SpringBootApplication @Modulith public class ModulithsApplication { public static void main(String[] args) { <p class="indent"> |
第二步,com.abc下有兩個子包,假設是com.abc.a和com.abc.b,這裡我們先假設一個情況,假設com.abc.a包下面的MyComponentA依賴於com.abc.b包下面的MyComponentB,我們這個工具是否可以檢測出這種依賴呢?
com.abc.a包下面的MyComponentA:
@Component public class MyComponentA { private final MyComponentB MyComponentB; <p class="indent"> |
下面是com.abc.b包下面的MyComponentB:
@Component public class MyComponentB { <p class="indent"> |
第三步,我們這個工具是透過測試環節編寫測試用例才能檢測出這樣的依賴,我們知道在正常情況下,當我們啟動SpringBootAplication時,Spring會掃描@Component元註解,然後一股腦子打入Jar包,這裡MyComponentA MyComponentB都標註了@Component,所以肯定會打包在一起,我們的工具特別之處在於,會只掃描com.abc.a子模組包或com.abc.b子模組包,不需要你任何配置,只要在測試類上標註一個註解:@ModuleTest
比如我們在com.abc.a下建立一個測試類:
@RunWith(SpringRunner.class) @ModuleTest public class ModuleATest { @Autowired ApplicationContext context; @Test public void bootstrapsModuleAOnly() { //有ModuleTest註解情況下會出錯 context.getBean(MyComponentA.class); } } <p class="indent"> |
當執行上面這個測試時,SpringBoot會報錯:
Parameter 0 of constructor in com.abc.a.MyComponentA required a bean of type 'com.abc.b.MyComponentB' that could not be found.
因為MyComponentA依賴於MyComponentB,而MyComponentB在com.abc.b這個子包(模組)下,而這個模組並沒有被測試類載入,所以沒有發現該模組下MyComponentB。
報這個錯誤說明兩個模組之間有依賴,如果報錯越多,說明依賴越多,這時候需要重構了,如果只有一處依賴,我們可以使用Spring的event機制來替代這種直接呼叫,也可以透過第三方服務註冊器進行發現呼叫。
總結
模組之間依賴我們需要在設計上及時發現並重構它,這樣才能保證上下文邊界的清晰,狗狗為什麼一出門就要撒尿,據說它也是在畫邊界一樣。
相關文章
- [原創]效能監控之大型日誌分析和監控系統,助力提升效能測試的有效手段
- NPM測試模組之rewire教程NPM
- 智慧硬體開發之WIFI模組訊號測試WiFi
- 軟體測試基礎丨測試工程師之間要善於發現閃光點——測試理念篇工程師
- 滲透測試服務之伺服器攻擊手段伺服器
- 模組測試
- Web 和移動應用程式測試之間的區別Web
- [譯] 測試原生,Flutter 和 React Native 移動開發之間的效能差異FlutterReact Native移動開發
- 知識普及:黑盒測試、白盒測試、灰盒測試之間的區別
- 微服務測試之介面測試和契約測試微服務
- 最有效的管理手段——《走出軟體作坊》有感
- 軟體安全測試有哪些測試手段?軟體測試報告收費貴嗎?測試報告
- 如何制定一個有效的測試策略
- SpringBoot2 整合測試元件,七種測試手段對比Spring Boot元件
- 效能測試中,TPS和RT之間的關係,你知道嗎?
- 測試開發之效能篇-JMeter介面測試JMeter
- 移動安全事件頻發大資料或是有效解決手段事件大資料
- 我眼中的開發和測試
- 1個月5次發版:測試人的模組測試策略分類歸納
- 測試開發之效能篇-效能測試設計
- Python中的單元測試框架:使用unittest進行有效測試Python框架
- 隨行付微服務測試之介面測試和契約測試微服務
- 緊耦合金融系統群的測試自動化策略(一)
- [原創] 上海好買基金招聘測試經理/測試主管/測試工程師/測試開發工程師(長期有效)工程師
- 軟體測試之Fuzzing和基於屬性的測試
- iOS架構設計解耦的嘗試之模組間通訊iOS架構解耦
- teprunner測試平臺用例前置模組開發
- 軟體驗收測試之α測試和β測試分別是什麼?
- 軟體測試培訓分享:軟體測試的發展空間大嗎
- [原創] 上海利得基金招聘測試經理/測試工程師/測試開發工程師(長期有效)工程師
- 測試開發【提測平臺】分享7-實現產品搜尋和優化時間顯示優化
- 用非常規手段有效刪除怪檔案薦
- 測試模組知識 Tree
- 發現深層次的bug——業務測試 1、業務測試簡介
- jwt_token的有效時間和重新整理時間JWT
- postpreSql和mysql之間語句的區別,目前使用發現到的MySql
- 開發人員測試 Devin AI 後的發現devAI
- 測試開發之單元測試-實現Git增量程式碼的Jacoco覆蓋率統計Git