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

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM