最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot單元測試之數(shù)據(jù)隔離詳解

 更新時間:2023年08月23日 11:36:17   作者:噠噠噠打代碼  
我們在寫單元測試時,有一個比較重要的要求是可以重復(fù)運行, 那么這樣就會有一個比較麻煩的問題:數(shù)據(jù)污染,所以本文為大家整理了兩個數(shù)據(jù)隔離的方式,希望對大家有所幫助

前言

我們在寫單元測試時,有一個比較重要的要求是可以重復(fù)運行,即只要外部參數(shù)不變,那么一定可以獲取確定的結(jié)果。 那么這樣就會有一個比較麻煩的問題:數(shù)據(jù)污染。 以數(shù)據(jù)庫操作為例,對于一些查詢類的測試用例倒還好,因為只要保證數(shù)據(jù)存在,那么查詢操作天生就是冪等的,不管你查多少次,數(shù)據(jù)都不會變。 但是對于寫入操作就不友好了,每一次運行單元測試,都會在數(shù)據(jù)庫中產(chǎn)生新的數(shù)據(jù),可能在第一次運行時正常,第二次運行時就由于數(shù)據(jù)沖突導(dǎo)致失敗。那對于這種情況,我們應(yīng)該如何去解決?

下面分享兩種我使用過的數(shù)據(jù)隔離的方式,供大家參考。

數(shù)據(jù)隔離

測試事務(wù)

這種方式比較常規(guī),適用場景也比較廣泛,即我們在測試用例中,通過@Transactional注解開始事務(wù),此時整個單元測試方法會被包裹在事務(wù)中,并且會在運行結(jié)束后,自動回滾。

我們可以在類或方法上添加@Transactional注解

/**
 * 在類上添加 @Transactional 注解,可以讓測試方法在執(zhí)行完畢后自動回滾,不會對數(shù)據(jù)庫造成影響。
 * 如果在方法上添加,則只影響對應(yīng)的方法
 */
@SpringBootTest
@Transactional
public class TransactionalTests extends AbstractTransactionalJUnit4SpringContextTests {
    @Resource
    private UserService userService;
    @Test
    void createRecord() {
        User user = userService.createUser();
        //to other things
    }
}

或者繼承AbstractTransactionalJUnit4SpringContextTests

/**
 * 在類上添加 @Transactional 注解,可以讓測試方法在執(zhí)行完畢后自動回滾,不會對數(shù)據(jù)庫造成影響。
 * 如果在方法上添加,則只影響對應(yīng)的方法
 */
@SpringBootTest
public class TransactionalTests extends AbstractTransactionalJUnit4SpringContextTests {
    @Resource
    private UserService userService;
    @Test
    void createRecord() {
        User user = userService.createUser();
        //to other things
    }
}

AbstractTransactionalJUnit4SpringContextTests實際上也是添加了@Transactional注解,只不過在此之外,它還提供了一些JDBC接口,可以讓我們更方便的操作數(shù)據(jù)庫。

使用這種方式來實現(xiàn)單元測試的話,由于測試用例中的所有數(shù)據(jù)庫操作都在事務(wù)中進行,然后運行結(jié)束后事務(wù)回滾,就可以保證不會染污數(shù)據(jù)庫數(shù)據(jù),做到數(shù)據(jù)隔離。但是它也存在一些問題:

  • 影響單元測試結(jié)果,在方法上層添加事務(wù),本質(zhì)上還是改變了方法的邏輯。比如說我被測試的方法中用到了不同的數(shù)據(jù)源(主從數(shù)據(jù)庫),一但被包裹了事務(wù),那么意味著我在這個事務(wù)內(nèi),都是使用同一條連接,這會對我們實際上期望運行的邏輯生產(chǎn)影響。
  • 排查問題困難,因為在單元測試運行結(jié)束之后,事務(wù)最終會回滾,也就意味著我們DB最終是沒有數(shù)據(jù)的,很難排查問題。

數(shù)據(jù)預(yù)處理與清理

上面說到事務(wù)會存在一些問題,那么我們不使用事務(wù),怎么保證數(shù)據(jù)隔離?我們可以通過幾種方式來在單元測試運行前后手動的增加或清理數(shù)據(jù):

通過@Sql注解來定義單元測試前后需要執(zhí)行的SQL腳本

    @Sql(
            scripts = "create-data.sql",
            config = @SqlConfig(transactionMode = ISOLATED)
    )
    @Sql(
            scripts = "delete-data.sql",
            config = @SqlConfig(transactionMode = ISOLATED),
            executionPhase = AFTER_TEST_METHOD
    )
    @Test
    void createRecord() {
        User user = userService.createUser();
        //to other things
    }

我們通過@Sql注解定義指定了兩個SQL腳本,分別用于在運行單元測試前創(chuàng)建測試數(shù)據(jù),以及在運行結(jié)束后,刪除數(shù)據(jù),這樣就可以保證我們的每次運行單元測試時的數(shù)據(jù)都是隔離的。

@Sql只是一種方式,我們還可以通過其它各種方式來執(zhí)行,比如@BeforeEach、@AfterEach來定義單元測試執(zhí)行前后的攔截器,或者Junit的@ExtendWith來定義外部的監(jiān)聽器等各種方式來處理數(shù)據(jù)的預(yù)處理與清理。

總結(jié)

上面分享了兩種數(shù)據(jù)隔離的方式,一般情況下都可以滿足我們的單元測試需求,但是實際上兩種方式都還存在一些問題,比如不管是哪種方式,都依賴于外部的數(shù)據(jù)庫,如果我們依賴的數(shù)據(jù)庫出現(xiàn)了異常,也會影響到我們的單元測試運行。而且使用外部數(shù)據(jù)庫也是無法完全做到數(shù)據(jù)隔離的,還是會有數(shù)據(jù)沖突的風險。那還有沒有更好的方法? 如果大家的單元測試環(huán)境有docker環(huán)境的話,那么可以考慮引入Testcontainers,可以很好的解決這個問題。下篇文章我會詳細講一下Testcontainers在單測數(shù)據(jù)隔離中的實踐。

以上就是SpringBoot單元測試之數(shù)據(jù)隔離詳解的詳細內(nèi)容,更多關(guān)于SpringBoot單元測試的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java切分字符串的2種方法實例

    java切分字符串的2種方法實例

    在我們?nèi)粘9ぷ髦薪?jīng)常遇到截取字符串的需求,下面這篇文章主要給大家介紹了關(guān)于java切分字符串的2種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Spring?boot?admin?服務(wù)監(jiān)控利器詳解

    Spring?boot?admin?服務(wù)監(jiān)控利器詳解

    這篇文章主要介紹了Spring?boot?admin?服務(wù)監(jiān)控利器詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java通過反射機制將對象封裝成JSON和JsonArray格式

    Java通過反射機制將對象封裝成JSON和JsonArray格式

    這篇文章主要介紹了Java通過反射機制將對象封裝成JSON和JsonArray格式,JAVA反射機制是在運行狀態(tài)中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法,需要的朋友可以參考下
    2023-10-10
  • 使用SpringBoot+Prometheus+Grafana實現(xiàn)可視化監(jiān)控

    使用SpringBoot+Prometheus+Grafana實現(xiàn)可視化監(jiān)控

    本文主要給大家介紹了如何使用Spring?actuator+監(jiān)控組件prometheus+數(shù)據(jù)可視化組件grafana來實現(xiàn)對Spring?Boot應(yīng)用的可視化監(jiān)控,文中有詳細的代碼供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2024-02-02
  • 詳解springboot如何更新json串里面的內(nèi)容

    詳解springboot如何更新json串里面的內(nèi)容

    這篇文章主要為大家介紹了springboot 如何更新json串里面的內(nèi)容,文中有詳細的解決方案供大家參考,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法

    Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法

    這篇文章主要介紹了Java8(291)之后禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008的解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java中常見的陷阱題及答案

    Java中常見的陷阱題及答案

    在電腦里找到一份當時學(xué)習(xí)JAVA時的筆記,看到一些現(xiàn)在已經(jīng)遺忘的細節(jié)。稍微整理了幾個,發(fā)出來與大家分享。這篇文章主要介紹了Java中常見的陷阱題及答案,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 解決引入spring-cloud-starter-openfeign后部分類找不到的問題

    解決引入spring-cloud-starter-openfeign后部分類找不到的問題

    這篇文章主要介紹了解決引入spring-cloud-starter-openfeign后部分類找不到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)之ArrayList從順序表到實現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之ArrayList從順序表到實現(xiàn)

    Java中的ArrayList是一種基于數(shù)組實現(xiàn)的數(shù)據(jù)結(jié)構(gòu),支持動態(tài)擴容和隨機訪問元素,可用于實現(xiàn)順序表等數(shù)據(jù)結(jié)構(gòu)。ArrayList在內(nèi)存中連續(xù)存儲元素,支持快速的隨機訪問和遍歷。通過學(xué)習(xí)ArrayList的實現(xiàn)原理和使用方法,可以更好地掌握Java中的數(shù)據(jù)結(jié)構(gòu)和算法
    2023-04-04
  • springboot2.x 接入阿里云市場短信發(fā)送的實現(xiàn)

    springboot2.x 接入阿里云市場短信發(fā)送的實現(xiàn)

    本文主要介紹了springboot2.x 接入阿里云市場短信發(fā)送的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

射阳县| 稷山县| 玉溪市| 章丘市| 阳信县| 叙永县| 东乡族自治县| 福海县| 图木舒克市| 九台市| 张家口市| 安泽县| 资阳市| 建昌县| 玛纳斯县| 方城县| 炉霍县| 宜君县| 周至县| 九台市| 浦县| 岐山县| 丁青县| 亚东县| 滦南县| 阳西县| 土默特右旗| 治县。| 花莲县| 合作市| 蓬溪县| 博野县| 新昌县| 花莲县| 库尔勒市| 崇仁县| 阳朔县| 应用必备| 亚东县| 鄂伦春自治旗| 深水埗区|