摘要:事務(wù)管理既可以在應(yīng)用層使用,也可以在測(cè)試中使用。也許你寫過(guò)這樣的測(cè)試通過(guò)將數(shù)據(jù)持久化操作截?cái)啵瑏?lái)解決測(cè)試之間相互對(duì)立,數(shù)據(jù)相互不影響的問(wèn)題。然而這樣方式會(huì)有副作用,就是數(shù)據(jù)持久化的過(guò)程不再真實(shí),沒(méi)有了的過(guò)程。在測(cè)試基類的,執(zhí)行。
在測(cè)試運(yùn)行時(shí),測(cè)試類中 @Transactional 注解,會(huì)導(dǎo)致測(cè)試中 Entity 數(shù)據(jù)的操作都是在內(nèi)存中完成,最終并不會(huì)進(jìn)行 commit 操作,也就是不會(huì)將 Entity 數(shù)據(jù)進(jìn)行持久化操作,從而導(dǎo)致測(cè)試的行為和真實(shí)應(yīng)用的行為不一致。
事務(wù)管理在應(yīng)用開(kāi)發(fā)中是種不可或缺的設(shè)計(jì),它是數(shù)據(jù)庫(kù)持久化處理的一種標(biāo)準(zhǔn)。我們知道,應(yīng)用程序開(kāi)發(fā)離不開(kāi)對(duì)數(shù)據(jù)的CRUD(增刪改查),事務(wù)的ACID性可以更好保證數(shù)據(jù)的完整性,保證相關(guān)數(shù)據(jù)的同生共死。單個(gè)事務(wù)生命周期主要分為三個(gè)階段,BEGIN TRANSACTION -> COMMIT TRANSACTION -> ROLLBACK TRANSACTION。
Spring Boot事務(wù)的使用分為命令式和聲明式常用的方式是聲明式注解(@Transactional)。事務(wù)管理既可以在應(yīng)用層使用,也可以在測(cè)試中使用。
為了保證測(cè)試之間的相互獨(dú)立,測(cè)試之間數(shù)據(jù)不會(huì)被相互影響。也許你寫過(guò)這樣的測(cè)試:
@SpringBootTest @ActiveProfiles("test") @Transactional public class UserControllerTest { }
@Transactional 通過(guò)將數(shù)據(jù)持久化操作截?cái)啵瑏?lái)解決測(cè)試之間相互對(duì)立,數(shù)據(jù)相互不影響的問(wèn)題。然而這樣方式會(huì)有副作用,就是數(shù)據(jù)持久化的過(guò)程不再真實(shí),沒(méi)有了commit的過(guò)程。從而會(huì)導(dǎo)致:
無(wú)法保證 Entity 之間關(guān)聯(lián)關(guān)系,唯一索引和主外鍵關(guān)聯(lián)的準(zhǔn)確性
無(wú)法保證 Entity 創(chuàng)建時(shí)間、更新時(shí)間和版本化(樂(lè)觀鎖)的賦值邏輯的準(zhǔn)確性
無(wú)法保證 Entity 中有 @Transient 注解的屬性的賦值邏輯的準(zhǔn)確性
測(cè)試的數(shù)據(jù)不是真實(shí)場(chǎng)景存在的問(wèn)題
測(cè)試中,單個(gè)事務(wù)中的準(zhǔn)備數(shù)據(jù),無(wú)法在多線程中共享。
......
然后 Spring 在測(cè)試問(wèn)題域中引入事務(wù)管理初衷是什么?為了解決什么問(wèn)題才需要將它引入?官方文檔介紹 Transaction management
按照官方文檔意思,為了解決測(cè)試運(yùn)行時(shí),程序訪問(wèn)真實(shí)的數(shù)據(jù)庫(kù),改變數(shù)據(jù)的狀態(tài),從而影響到后續(xù)的測(cè)試問(wèn)題。
其實(shí)這里應(yīng)該批判性思維一下,為什么測(cè)試運(yùn)行時(shí),需要訪問(wèn)真實(shí)的數(shù)據(jù)庫(kù)?為什么測(cè)試之間的數(shù)據(jù)會(huì)相互影響?
對(duì)于每個(gè)測(cè)試來(lái)說(shuō),每次運(yùn)行前都應(yīng)該有干凈的上下文,或者說(shuō)獨(dú)立的上下文,有數(shù)據(jù)清理和準(zhǔn)備的過(guò)程,測(cè)試與測(cè)試之間相互隔離。也就是說(shuō),為什么測(cè)試不能用內(nèi)存數(shù)據(jù)庫(kù)或者嵌入式數(shù)據(jù)庫(kù)?為什么不是每個(gè)測(cè)試運(yùn)行前清理一下數(shù)據(jù)庫(kù)中的數(shù)據(jù),保證測(cè)試用例運(yùn)行前的一方凈土,不被上個(gè)測(cè)試數(shù)據(jù)影響?
答案當(dāng)然是,可以!!!
寫在最后如何做?實(shí)現(xiàn)一個(gè) TruncateDatabaseService,只刪除表的數(shù)據(jù),不刪除表的結(jié)果。 在測(cè)試基類的@BeforeEach,執(zhí)行 truncate。源碼Truncate Database:
TruncateDatabaseBasicOnHibernateService
TruncateDatabaseBasicOnMybatisService
原文鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/71659.html
摘要:前言如題,今天介紹的聲明式事務(wù)。提供一個(gè)注解在配置類上來(lái)開(kāi)啟聲明式事務(wù)的支持。而在配置里還開(kāi)啟了對(duì)聲明式事務(wù)的支持,代碼如下所以在中,無(wú)須顯式開(kāi)啟使用注解。源碼下載后語(yǔ)以上為聲明式事務(wù)的教程。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人如有問(wèn)題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你的問(wèn)題。 前言 如題,今天介紹 SpringBoot 的 聲明式事務(wù)。 Spring 的事務(wù)機(jī)制 所有的數(shù)據(jù)訪問(wèn)技術(shù)都有事務(wù)處...
摘要:添加依賴新建項(xiàng)目選擇三個(gè)依賴對(duì)于已存在的項(xiàng)目可以在加入,將會(huì)幫你自動(dòng)配置好配置基本信息然后在下添加基本配置數(shù)據(jù)庫(kù)連接地址數(shù)據(jù)庫(kù)賬號(hào)數(shù)據(jù)庫(kù)密碼數(shù)據(jù)庫(kù)驅(qū)動(dòng)創(chuàng)建實(shí)體創(chuàng)建一個(gè)實(shí)體,包含姓名年齡屬性創(chuàng)建數(shù)據(jù)訪問(wèn)接口創(chuàng)建一個(gè) 添加依賴 新建項(xiàng)目選擇web,MyBatis,MySQL三個(gè)依賴 showImg(https://segmentfault.com/img/bV2l1L?w=1684&h=1...
摘要:官網(wǎng)中,對(duì)單文檔的操作是原子性的。因此建議使用嵌入式文檔來(lái)實(shí)現(xiàn)事務(wù)需求,而不是規(guī)范化的跨文檔設(shè)計(jì)。所以開(kāi)始提供了對(duì)副本集多文檔事務(wù)的支持,注意是副本集,也就是說(shuō)單是不生效的。上面創(chuàng)建的中的上添加了提供的注解,所以的事務(wù)可以和的事務(wù)統(tǒng)一管理。 官網(wǎng):mongoDB中,對(duì)單文檔的操作是原子性的。例如insertOne,updateOne等操作。因此建議使用嵌入式文檔來(lái)實(shí)現(xiàn)事務(wù)需求,而不是規(guī)...
閱讀 434·2019-08-29 12:44
閱讀 3012·2019-08-26 17:49
閱讀 2440·2019-08-26 13:40
閱讀 1187·2019-08-26 13:39
閱讀 3665·2019-08-26 11:59
閱讀 1828·2019-08-26 10:59
閱讀 2466·2019-08-23 18:33
閱讀 2698·2019-08-23 18:30