1. 程式人生 > 資料庫 >Mock服務設計與實現:MySQL驅動位元組碼修改增強

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方案設計》,原文作者: 。