簡體   English   中英

包含 SQL 查詢的方法的 JUnit 測試

[英]JUnit test for a method that contains SQL queries

我有一個舊的 Java 項目(沒有使用框架/構建工具),它有一個充滿 SQL 方法和相應 Bean 類的類。 SQL 方法主要使用 SELECT、INSERT 和 UPDATE 查詢,如下所示:

public static void sqlUpdateAge(Connection dbConnection, int age, int id) {

    PreparedStatement s = null;
    ResultSet r = null;

    String sql = "UPDATE person SET age = ? WHERE id = ?";

    try {
        s = dbConnection.prepareStatement(sql);
        s.setInt(1, age);
        s.setInt(2, id);
        s.addBatch();
        s.executeBatch();

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (r != null)
                r.close();
            if (s != null)
                s.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

當涉及到 SQL 查詢時,單元測試的最佳實踐是什么?

我能想到的最簡單的方法是使用我的開發數據庫; 只需在測試類中調用 sqlUpdateAge(),查詢數據庫中的結果集並 assertTrue 設置的年齡在結果集中。 但是,這會用不必要的數據填滿開發數據庫,​​我想避免這種情況。

是創建所謂的內存數據庫的解決方案還是以某種方式回滾我所做的更改?

如果我需要一個內存數據庫:

  1. 我將在哪里以及如何創建它? 直接到測試類,或者可能到配置文件?
  2. 我如何將它傳遞給 updateAge() 方法?

有了 Spring Boot 項目,事情會很容易。 在你的情況下,你有很多策略:

  1. 配置H2數據庫。 您可以通過使用@BeforeEach注釋在setUp方法中創建架構和插入數據來初始化您的數據庫。
  2. 您可以使用像DbUnit這樣的專用框架。
  3. 您還必須在單元測試的setUp方法中初始化dbConnection

我建議看看你是否可以從自動構建開始。 那是通過引入構建工具(例如 maven 或 gradle) - 或者如果不可能 - scipting 構建。 無論如何,您的目標應該是在代碼更改時輕松觸發構建和測試。

如果您不能在保證所有單元測試都已運行的情況下對每個更改生成一致的構建,那么首先編寫單元測試就真的沒有價值。 那是因為否則,您的測試最終將因代碼修改而失敗,除非您的所有測試都自動運行,否則您不會注意到。

一旦你有了它,你可能會有一些關於如何運行單元或集成測試的提示。

由於您無法從許多應用程序框架提供的測試支持中受益,因此您基本上可以自行決定如何配置數據庫測試設置。 在那種情況下,我不認為內存數據庫真的是最好的選擇,因為:

  • 這是一種與您通常使用的數據庫技術不同的數據庫技術,並且正如代碼所示,您沒有使用 ORM 來處理不同的 SQL 方言。 在這種情況下,您可能會發現自己處於無法准確測試代碼的位置,因為 SQL 方言差異。
  • 您需要自己完成內存數據庫的所有設置 - 這當然是可能的,但它仍然是您需要維護的一段代碼,並且也可能失敗。

我能想到的兩種選擇是:

  • 每次運行測試時,使用 Docker 啟動您的實際數據庫技術。 (這也是您必須為自己編寫腳本的內容,但它很可能是您需要執行的一個非常簡單且簡短的命令)
  • 在您使用的測試環境上運行一個測試數據庫。 每次運行測試之前,請確保將數據庫重置為原始狀態。 (最簡單的方法是刪除現有架構並恢復到原始架構)。 在這種情況下,您需要確保不會針對同一個測試數據庫並行運行多個構建。

這些建議僅適用於您有 shell 經驗和/或得到操作人員支持的情況。 如果沒有,設置 H2 可能更容易、更直接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM