Mock服務設計與實現:MySQL驅動位元組碼修改增強
摘要:華為導流測試平臺通過對線上流量回放到被測環境中,利用線上真實流量進行充分測試,保證業務系統穩定上線。但是業務在導流測試過程中現網資料庫往往難以同步到測試環境,導致現網資料無法正常回放,測試價值降低。由此提出回放過程中對資料庫進行mock,以保證回放過程正常進行。
一、需求分析
1.背景
華為導流測試平臺通過對線上流量回放到被測環境中,利用線上真實流量進行充分測試,保證業務系統穩定上線。但是業務在導流測試過程中現網資料庫往往難以同步到測試環境,導致現網資料無法正常回放,測試價值降低。由此提出回放過程中對資料庫進行mock,以保證回放過程正常進行。
2.方案分析
資料庫Mock方案大致分為以下3種:
3.方案對比
二、方案2:MySQL驅動位元組碼修改增強方案詳細說明
1.方案設計
位元組碼增強:通過分析MySQL資料庫驅動原始碼可知,獲取資料庫返回的ResultSet結果集的方法在com.mysql.jdbc.PreparedStatement類中的executeQuery方法,和執行完execute方法之後再呼叫getResultSet方法兩種方式,所以我們需要對executeQuery和execute兩個方法進行位元組碼修改增強。即在這兩個方法執行完成之後,注入以下程式碼:獲取Mock檔案中的行列資料,轉成MySQL需要的位元組碼物件,再設定到ResultSet例項化物件中替換原資料庫的真實資料即可。
Mock資料設計和解析:一次請求鏈路中,比如有下面三次查詢語句,並且存在相同sql執行多次並且返回結果不同的情況,那麼我們在回放請求過程時,就得按順序去依次取得每條sql執行的結果資料,而且能做到可對鏈路中其中一些sql結果進行mock,不mock的sql返回資料庫的真實資料。
2.使用說明
1.在需要資料庫Mock功能的第三方服務的啟動命令中增加-javaagent引數指向該jar包,方式如下:
java -javaagent:D:/dbmockagent.jar -jar **.jar
2.引數設定:
(1)可設定dbmock.file引數指定Mock資料檔案,不設定時預設為C:/dbmock.data。目前只實現了從檔案中讀取mock資料,可擴充套件從介面等其它地方獲取Mock資料。
java -javaagent:D:/dbmockagent.jar -Ddbmock.file="D:/dbmock.data" –jar **.jar
(2)可設定dbmock.port引數指定過載Mock資料介面呼叫的埠,可不設定,預設為8888:
java -javaagent:D:/dbmockagent.jar -Ddbmock.file="D:/dbmock.data" -Ddbmock.port=8088 -jar **.jar
3.方案測試
3.1 使用MySQL驅動直連資料庫
3.1.1 不使用外掛
3.1.2 使用外掛
再次執行上面的程式碼,執行結果如下,輸出了DBMock相關的log資訊,返回的資料正好為上面mock的資料,並且兩次sql語句雖然相同,但是返回的結果資料是按照mock檔案裡的順序返回的。
3.2 SpringBoot工程中通過MyBatis連線資料庫
3.2.1 不使用外掛
3.2.2 使用外掛
3.3 Mock資料更新
本文分享自華為雲社群《資料庫Mock方案設計》,原文作者: 。