測試和發現模組之間耦合的有效手段
雖然我們使用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
- 模組測試
- MicroPython的random模組(pyb上測試)Pythonrandom
- 測試模組知識 Tree
- netlink 是 Go 和核心模組之間優秀的通訊兵Go
- 軟體測試基礎丨測試工程師之間要善於發現閃光點——測試理念篇工程師
- teprunner測試平臺用例前置模組開發
- 滲透測試服務之伺服器攻擊手段伺服器
- 如何使用spring測試模組測試請求功能Spring
- 1個月5次發版:測試人的模組測試策略分類歸納
- python時間模組time和datetimePython
- [譯] 測試原生,Flutter 和 React Native 移動開發之間的效能差異FlutterReact Native移動開發
- npm模組管理-區分測試包和穩定包NPM
- 對抗測試-軍用裝置的有效射頻測試和故障排除
- Web 和移動應用程式測試之間的區別Web
- springboot 多模組下的單元測試配置Spring Boot
- abp加DDD開發:低耦合、可複用、可擴充套件的【工單】業務模組-簡介和整合套件
- kubernetes實踐之十八:叢集各模組之間的通訊
- 效能測試中,TPS和RT之間的關係,你知道嗎?
- Django之模組的繼承和匯入Django繼承
- SpringBoot2 整合測試元件,七種測試手段對比Spring Boot元件
- Python模組之urllib模組Python
- python模組之collections模組Python
- 知識普及:黑盒測試、白盒測試、灰盒測試之間的區別
- Nodejs核心模組之net和httpNodeJSHTTP
- Python 隨機(random)模組的不可預測之美Python隨機random
- 微服務測試之介面測試和契約測試微服務
- 模組學習之hashlib模組
- 模組學習之logging模組
- Laravel-Module 模組開發一:評論模組實現Laravel
- 智駕模擬測試實戰之自動泊車HiL模擬測試
- CommonJS模組 和 ECMAScript模組JS
- 如何制定一個有效的測試策略
- 軟體安全測試有哪些測試手段?軟體測試報告收費貴嗎?測試報告
- Nestjs模組機制的概念和實現原理JS
- surging如何使用swagger 元件測試業務模組Swagger元件
- Python 自動化測試 必會模組 UnittestPython