雲原生時代的單元測試
1. google測試分層理論
谷歌三篇論文 Google File System、Google Bigtable、Google MapReduce引領了大資料整個領域。
Google 軟體測試之道 引領了軟體測試行業。
測試金字塔,測試分層是這本書兩個基本的理論(圖片擷取自書中):
書中大部分總結都來自谷歌在2010年前後谷歌的實踐,參考https://testing.googleblog.com/
現在是2020-07-12,雲原生的基礎設施和編排能力已經成為企業的標配,結合書中的理論,我們需要重新思考具體業務實踐。
2. 單元測試依賴資料庫
單元測試要儘量的減少依賴,其中包括對資料庫的依賴。表2.2中小型測試中推薦使用Mock的方式來進行資料庫相關的測試。
為什麼要減少對外界的依賴?
因為依賴會帶來:
依賴構建成本高,不確定性,不穩定性,耗時高等因素,這些因素對小型測試是有害的。
在微服務和程式碼結構分層的前提下(儲存服務|| DAO層),儲存層程式碼如何進行單元測試呢?
他們通常採用記憶體資料庫作為單元測試資料庫,如:H2
步驟:
- 配置針對單元測試的資料來源mybatis_config_h2_test.xml
<!-- h2測試庫配置 -->
<environment id="pre">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:test;INIT=runscript from nit.sql'\;"/>
<property name="username" value=""/>
<property name="password" value=""/>
<property name="poolPingEnabled" value="true"/>
<property name="poolPingQuery" value="SELECT 1+1"/>
<property name="poolPingConnectionsNotUsedFor" value="0"/>
<property name="poolMaximumActiveConnections" value="150"/>
<property name="poolMaximumIdleConnections" value="150"/>
<property name="poolMaximumCheckoutTime" value="20000"/>
<property name="poolTimeToWait" value="20000"/>
</dataSource>
</environment>
</environments>
- 單元測試過程中load資料來源
進行單元測試
使用記憶體資料庫模擬實際資料庫有以下幾個問題:記憶體資料庫無法完全模擬實際資料庫的能力,MySQL 、Oracle...
對於一不支援的情況需要進行適配
記憶體資料庫測試通過不能完全認為在實際資料庫中沒問題
開發同學需要學習h2資料庫的一些坑,如何規避
靈魂的拷問:
為什麼用這麼大精力構建“假的”記憶體資料庫,直接安裝MySQL不可以嗎?
3. 雲原生和DevOps
這10年我們經歷了什麼?
- 機器配置: 2010年公司配置的開發機是8G記憶體,終端開發為了加快編譯配置16G 2020年32G記憶體開發機是標配,另外還配置了研發域DevCloud機器 電腦裡把MySQL、Redis、MongoDB....都安裝啟動也沒什麼壓力。
- 技術的發展 雲原生:基礎設施不可變性,利用docker、映象能力可以快速構MySQL,Redis等依賴 DevOps:將團隊的基礎設施和流程固化
我們有條件快速、低成本、便捷的構建環境
我們的方案:
拋棄記憶體資料庫,單元測試直接依賴MySQL、Redis等資料基礎設施
以依賴MySQL資料庫的單元測試為例:
- 單元測試直接依賴本地MySQL資料庫
- 製作團隊基礎開發映象,安裝MySQL資料
- 團隊成員根據自身開發需求編寫資料庫指令碼
- DevOps流程中依賴相同的基礎映象,在基礎映象之上增加編譯相關層次
收益:
- 團隊不需要再為H2資料庫的坑努力
- 本地除錯更加方便
- 開發環境、編譯環境、真實環境(測試、線上)依賴一致,測試更加有效 # 4. 思考 ## 4.1 複雜度來源 程式要解決的是業務複雜度問題,微服務技術並沒有降低業務複雜度,甚至因為微服務之間的依賴提高了複雜度。 真正的業務並不會像迭代0中程式碼編寫的那樣純粹,按照資料夾區分單元測試、模組間測試、介面測試。複雜度使得我們在做金字塔底層測試時需要進行很多Mock
過早進行整合測試測試的成本會很高
4.2 雲原生體系下該如何做測試
- 我們測試物件,後臺服務開始雲化,雲化後該怎麼測試?
- 藉助雲原生的能力,構建測試基礎設施,測試雲化後會有什麼樣的變化?
本文不是挑戰測試分層和測試金字塔理論,主要是通過在專案中的一些實踐,引發一些思考,歡迎拍磚,一起討論
相關文章
- 雲原生引擎單元測試實踐
- 雲原生時代的 APM
- 單元測試:單元測試中的mockMock
- 測試 之Java單元測試、Android單元測試JavaAndroid
- 單元測試-【轉】論單元測試的重要性
- 單元測試時靜態方法注意點
- 年輕時,我不寫單元測試
- 雲原生時代下的容器映象安全(上)
- 單元測試,只是測試嗎?
- 單元測試-一份如何寫好單元測試的參考
- 單元測試的規範
- Apache Camel的單元測試Apache
- java中的單元測試Java
- golang單元測試Golang
- 單元測試真
- iOS 單元測試iOS
- python 單元測試Python
- 前端單元測試前端
- Flutter 單元測試Flutter
- 單元測試 Convey
- 單元測試工具
- 聊聊單元測試
- 十五、單元測試
- Go單元測試Go
- SpringBoot單元測試Spring Boot
- 程式碼重構與單元測試——重構1的單元測試(四)
- Vue 應用單元測試的策略與實踐 04 - Vuex 單元測試Vue
- 雲原生時代如何用 Prometheus 實現效能壓測可觀測-Metrics 篇Prometheus
- 前端測試:Part II (單元測試)前端
- 容器映象服務:雲原生時代的核心基石
- 雲原生時代的DevOps平臺設計之道dev
- 雲原生時代的運維體系進化運維
- 雲原生時代,如何“玩轉”容器安全?
- Vue 應用單元測試的策略與實踐 02 - 單元測試基礎Vue
- Vue 應用單元測試的策略與實踐 03 - Vue 元件單元測試Vue元件
- SAP 電商雲 Spartacus UI SSR 單元測試裡的 callFakeUI
- 如何寫出好的單元測試
- Go語言中的單元測試Go