摘要:事務(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
摘要:前言如題,今天介紹的聲明式事務(wù)。提供一個注解在配置類上來開啟聲明式事務(wù)的支持。而在配置里還開啟了對聲明式事務(wù)的支持,代碼如下所以在中,無須顯式開啟使用注解。源碼下載后語以上為聲明式事務(wù)的教程。 微信公眾號:一個優(yōu)秀的廢人如有問題或建議,請后臺留言,我會盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 的 聲明式事務(wù)。 Spring 的事務(wù)機(jī)制 所有的數(shù)據(jù)訪問技術(shù)都有事務(wù)處...
摘要:添加依賴新建項目選擇三個依賴對于已存在的項目可以在加入,將會幫你自動配置好配置基本信息然后在下添加基本配置數(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...
摘要:官網(wǎng)中,對單文檔的操作是原子性的。因此建議使用嵌入式文檔來實現(xiàn)事務(wù)需求,而不是規(guī)范化的跨文檔設(shè)計。所以開始提供了對副本集多文檔事務(wù)的支持,注意是副本集,也就是說單是不生效的。上面創(chuàng)建的中的上添加了提供的注解,所以的事務(wù)可以和的事務(wù)統(tǒng)一管理。 官網(wǎng):mongoDB中,對單文檔的操作是原子性的。例如insertOne,updateOne等操作。因此建議使用嵌入式文檔來實現(xiàn)事務(wù)需求,而不是規(guī)...
閱讀 433·2019-08-29 12:44
閱讀 3011·2019-08-26 17:49
閱讀 2433·2019-08-26 13:40
閱讀 1185·2019-08-26 13:39
閱讀 3663·2019-08-26 11:59
閱讀 1827·2019-08-26 10:59
閱讀 2465·2019-08-23 18:33
閱讀 2697·2019-08-23 18:30