成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

不要在 Spring Boot 集成測試中使用 @Transactional

UnixAgain / 867人閱讀

摘要:事務(wù)管理既可以在應(yīng)用層使用,也可以在測試中使用。也許你寫過這樣的測試通過將數(shù)據(jù)持久化操作截斷,來解決測試之間相互對立,數(shù)據(jù)相互不影響的問題。然而這樣方式會有副作用,就是數(shù)據(jù)持久化的過程不再真實,沒有了的過程。在測試基類的,執(zhí)行。

在測試運(yùn)行時,測試類中 @Transactional 注解,會導(dǎo)致測試中 Entity 數(shù)據(jù)的操作都是在內(nèi)存中完成,最終并不會進(jìn)行 commit 操作,也就是不會將 Entity 數(shù)據(jù)進(jìn)行持久化操作,從而導(dǎo)致測試的行為和真實應(yīng)用的行為不一致。

事務(wù)管理在應(yīng)用開發(fā)中是種不可或缺的設(shè)計,它是數(shù)據(jù)庫持久化處理的一種標(biāo)準(zhǔn)。我們知道,應(yīng)用程序開發(fā)離不開對數(shù)據(jù)的CRUD(增刪改查),事務(wù)的ACID可以更好保證數(shù)據(jù)的完整性,保證相關(guān)數(shù)據(jù)的同生共死。單個事務(wù)生命周期主要分為三個階段,BEGIN TRANSACTION -> COMMIT TRANSACTION -> ROLLBACK TRANSACTION。

Spring Boot事務(wù)的使用分為命令式聲明式常用的方式是聲明式注解(@Transactional)。事務(wù)管理既可以在應(yīng)用層使用,也可以在測試中使用。

為了保證測試之間的相互獨(dú)立,測試之間數(shù)據(jù)不會被相互影響。也許你寫過這樣的測試:

@SpringBootTest
@ActiveProfiles("test")
@Transactional
public class UserControllerTest { }

@Transactional 通過將數(shù)據(jù)持久化操作截斷,來解決測試之間相互對立,數(shù)據(jù)相互不影響的問題。然而這樣方式會有副作用,就是數(shù)據(jù)持久化的過程不再真實,沒有了commit的過程。從而會導(dǎo)致:


無法保證 Entity 之間關(guān)聯(lián)關(guān)系,唯一索引和主外鍵關(guān)聯(lián)的準(zhǔn)確性

無法保證 Entity 創(chuàng)建時間、更新時間和版本化(樂觀鎖)的賦值邏輯的準(zhǔn)確性

無法保證 Entity 中有 @Transient 注解的屬性的賦值邏輯的準(zhǔn)確性

測試的數(shù)據(jù)不是真實場景存在的問題

測試中,單個事務(wù)中的準(zhǔn)備數(shù)據(jù),無法在多線程中共享。

......

然后 Spring 在測試問題域中引入事務(wù)管理初衷是什么?為了解決什么問題才需要將它引入?官方文檔介紹 Transaction management

按照官方文檔意思,為了解決測試運(yùn)行時,程序訪問真實的數(shù)據(jù)庫,改變數(shù)據(jù)的狀態(tài),從而影響到后續(xù)的測試問題。

其實這里應(yīng)該批判性思維一下,為什么測試運(yùn)行時,需要訪問真實的數(shù)據(jù)庫?為什么測試之間的數(shù)據(jù)會相互影響?
對于每個測試來說,每次運(yùn)行前都應(yīng)該有干凈的上下文,或者說獨(dú)立的上下文,有數(shù)據(jù)清理和準(zhǔn)備的過程,測試與測試之間相互隔離。也就是說,為什么測試不能用內(nèi)存數(shù)據(jù)庫或者嵌入式數(shù)據(jù)庫?為什么不是每個測試運(yùn)行前清理一下數(shù)據(jù)庫中的數(shù)據(jù),保證測試用例運(yùn)行前的一方凈土,不被上個測試數(shù)據(jù)影響?

答案當(dāng)然是,可以!!!

寫在最后

如何做?實現(xiàn)一個 TruncateDatabaseService,只刪除表的數(shù)據(jù),不刪除表的結(jié)果。 在測試基類的@BeforeEach,執(zhí)行 truncate。源碼Truncate Database:

TruncateDatabaseBasicOnHibernateService
TruncateDatabaseBasicOnMybatisService
原文鏈接

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71659.html

相關(guān)文章

  • SpringBoot 實戰(zhàn) (十) | 聲明式事務(wù)

    摘要:前言如題,今天介紹的聲明式事務(wù)。提供一個注解在配置類上來開啟聲明式事務(wù)的支持。而在配置里還開啟了對聲明式事務(wù)的支持,代碼如下所以在中,無須顯式開啟使用注解。源碼下載后語以上為聲明式事務(wù)的教程。 微信公眾號:一個優(yōu)秀的廢人如有問題或建議,請后臺留言,我會盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 的 聲明式事務(wù)。 Spring 的事務(wù)機(jī)制 所有的數(shù)據(jù)訪問技術(shù)都有事務(wù)處...

    ygyooo 評論0 收藏0
  • Spring Boot快速入門(五):使用MyBatis(注解形式)進(jìn)行數(shù)據(jù)庫操作

    摘要:添加依賴新建項目選擇三個依賴對于已存在的項目可以在加入,將會幫你自動配置好配置基本信息然后在下添加基本配置數(shù)據(jù)庫連接地址數(shù)據(jù)庫賬號數(shù)據(jù)庫密碼數(shù)據(jù)庫驅(qū)動創(chuàng)建實體創(chuàng)建一個實體,包含姓名年齡屬性創(chuàng)建數(shù)據(jù)訪問接口創(chuàng)建一個 添加依賴 新建項目選擇web,MyBatis,MySQL三個依賴 showImg(https://segmentfault.com/img/bV2l1L?w=1684&h=1...

    lentoo 評論0 收藏0
  • mongoDB 4.0 事務(wù)

    摘要:官網(wǎng)中,對單文檔的操作是原子性的。因此建議使用嵌入式文檔來實現(xiàn)事務(wù)需求,而不是規(guī)范化的跨文檔設(shè)計。所以開始提供了對副本集多文檔事務(wù)的支持,注意是副本集,也就是說單是不生效的。上面創(chuàng)建的中的上添加了提供的注解,所以的事務(wù)可以和的事務(wù)統(tǒng)一管理。 官網(wǎng):mongoDB中,對單文檔的操作是原子性的。例如insertOne,updateOne等操作。因此建議使用嵌入式文檔來實現(xiàn)事務(wù)需求,而不是規(guī)...

    dabai 評論0 收藏0

發(fā)表評論

0條評論

UnixAgain

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<