摘要:華為導流測試平台通過對線上流量回放到被測環境中,利用線上真實流量進行充分測試,保證業務系統穩定上線。但是業務在導流測試過程中現網數據庫往往難以同步到測試環境,導致現網數據無法正常回放,測試價值降低。由此提出回放過程中對數據庫進行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 。