首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JdbcProxy 實戰:脫離數據庫的 Java 應用測試——記錄、回放與 HTTP/文件雙模式

     編輯:Java 相關知識

測試痛點:數據庫依賴導致的環境脆弱與數據準備困境

  • 共享測試庫:數據相互污染、並發衝突
  • 數據變更不可逆:想測「空表」卻無法快速恢復
  • 無庫環境:離線開發、CI 隔離環境無法測試
  • 場景構建繁瑣:分頁、異常、邊界數據需反覆造數

JdbcProxy 核心原理

實現 JDBC 2.0 介面代理,攔截所有 JDBC 調用,兩種模式:

  1. 追蹤模式:生成可讀日志,排查 SQL 錯誤、參數綁定、空指針
  2. 存根模式:記錄 Request/Response XML → 合併為單文件 → 回放時無需數據庫直接返回記錄結果

三步走:生成測試數據文件

步驟 1:追蹤模式生成可讀日志 (排查用)


String driver = "nl.griffelservices.proxy.jdbc.oracle.StubTracerDriver";
String url = "jdbc:tracer::COM.ibm.db2.jdbc.app.DB2Driver:jdbc:db2:SAMPLE";
// 格式: jdbc:tracer:::
// logFile 為空輸出控制台

輸出示例:每個方法調用、參數、返回值、異常完整記錄,含 Connection/Statement/ResultSet 對象狀態快照。

步驟 2:存根模式生成 Request/Response 文件對


String url = "jdbc:stubtracer:output:COM.ibm.db2.jdbc.app.DB2Driver:jdbc:db2:SAMPLE";
// 格式: jdbc:stubtracer:::
// output 目錄下生成 request_0_0.txt, response_0_0.txt ... (id_status)

Request 示例:


<request>
  <class>java.sql.Driver</class>
  <id>0</id>
  <status>0</status>
  <method>connect</method>
  <parameter><class>java.lang.String</class><value>jdbc:db2:SAMPLE</value></parameter>
  <parameter><class>java.util.Properties</class><value>{language=C}</value></parameter>
</request>

Response 示例:返回新對象代理標識 ProxyObject(id=1, status=0)。

步驟 3:StubTracerMerger 合併為單一回放文件


// 命令行
java nl.griffelservices.proxy.stub.StubTracerMerger output
// 參數:  [ []]
// 輸出: 整合 XML 到控制台,手工保存為 merger.xml

合併邏輯:按調用順序將所有 Request/Response 串聯在 <response> 根節點下,對象狀態用 ProxyObject(id, status) 追蹤。

回放模式:脫離數據庫運行測試

模式 A:HTTP 服務器模式 (團隊協作、數據一致性)


String driver = "nl.griffelservices.proxy.jdbc.oracle.StubTracerDriver";
String url = "jdbc:stub:localhost:80:1000";
// 格式: jdbc:stub:::
// 需將 merger.xml 放入 HTTP 服務器根目錄 (如 Apache htdocs/index.xml)

流程:應用發起 JDBC 調用 → 代理發 HTTP 請求 → 服務器從 merger.xml 匹配 Request 返回 Response → 代理構造結果返回應用。

模式 B:本地文件直讀模式 (單人、高效、無需 HTTP 服務器)

原版 JdbcProxy 不支持,作者擴展實現:

  • 新增 FileStubTracerDriver、FileClient、FileStubHandler、FileCombinedHandler
  • 修改 StubTracerHandler.invoke() 直接內存合併,生成 mergerfile.xml

// 生成合併文件
String url = "jdbc:stubtracer::COM.ibm.db2.jdbc.app.DB2Driver:jdbc:db2:SAMPLE";
// 運行應用後調用
new GenerateMergerFile("output/mergerfile.xml").generateFile();

// 回放使用
String driver = "nl.griffelservices.proxy.jdbc.oracle.FileStubTracerDriver";
String url = "jdbc:stub:output/mergerfile.xml";
// 格式: jdbc:stub:

測試場景構建實戰

改進版關鍵代碼片段

內存合併生成文件 (GenerateMergerFile)


public class GenerateMergerFile {
    private String outputPath;
    public GenerateMergerFile(String path) { this.outputPath = path; }
    public void generateFile() {
        // 從靜態 TreeMap 讀取所有 Request/Response
        // 按 id/status 排序組裝 XML
        // 輸出到 outputPath
    }
}

本地文件直讀客戶端 (FileClient)


public class FileClient {
    private Document mergerDoc; // 解析 mergerfile.xml
    public Object invoke(Request req) {
        // XPath 匹配 request[@id=...][@status=...]
        // 返回對應 response 的 returnvalue
    }
}

最佳實踐建議

  1. 版本控制 merger.xml:作為測試數據資產納入 Git,代碼與數據同步演進。
  2. 分類存儲:merger/normal.xml、merger/empty.xml、merger/exception.xml 對應不同測試套件。
  3. 參數化數據:結合屬性文件替換 merger.xml 中的動態值(如時間戳、ID)。
  4. CI 集成:構建階段自動運行「記錄模式」生成基線 merger.xml,測試階段切換「回放模式」。
  5. 安全清理:merger.xml 可能包含敏感數據(真實用戶名/密碼),發布前需脫敏。

總結

JdbcProxy 以 標準 JDBC 代理 + XML 記錄/回放 解決了「測試需要數據庫但不想依賴數據庫」的矛盾。原版 HTTP 模式適合團隊協作,改進版文件模式適合單人高效開發。核心價值:將數據庫行為凍結為可版本化、可編輯、可攜帶的測試數據文件,讓單元/集成測試真正做到快速、隔離、可重複。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景構建方法
空結果集編輯 merger.xml 刪除 ResultSet 相關 Response,或修改 rowCount=0
單行結果保留一行數據
分頁測試構造 100 行數據,驗證 LIMIT/OFFSET 邏輯
異常模擬在 Response 中注入 SQLException
多用戶並行測試HTTP 模式共享同一 merger.xml,數據天然一致