自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Rspec的數(shù)據(jù)庫事務(wù):如何清理陳舊數(shù)據(jù)?

數(shù)據(jù)庫 其他數(shù)據(jù)庫
測(cè)試用例之間的陳舊數(shù)據(jù)是RSpec中競(jìng)態(tài)條件的主要原因之一,包括數(shù)據(jù)庫Redis、文件等。本文就將討論如何清理數(shù)據(jù)庫中的陳舊數(shù)據(jù)。

本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。

測(cè)試用例之間的陳舊數(shù)據(jù)是RSpec中競(jìng)態(tài)條件的主要原因之一,包括數(shù)據(jù)庫Redis、文件等。本文就將討論如何清理數(shù)據(jù)庫中的陳舊數(shù)據(jù)。

Rails Rspec后臺(tái)默認(rèn)事務(wù)

如果使用rails-rspec,默認(rèn)情況下,spec/rails_helper.rb中會(huì)啟用以下配置:

  1. RSpec.configuredo |config| 
  2.                   config.use_transactional_fixtures=true 
  3.                 end 

這意味著“在事務(wù)內(nèi)運(yùn)行每個(gè)示例”,即在示例結(jié)束時(shí),所有數(shù)據(jù)庫的變更都將回滾。

如何讓“事務(wù)裝置”實(shí)現(xiàn)“在事務(wù)內(nèi)運(yùn)行每個(gè)示例”?

在深入研究Rails 4代碼庫,了解了它在后臺(tái)的實(shí)際工作之后,我發(fā)現(xiàn)了以下內(nèi)容。setup_fixtures函數(shù)中,Rails為每個(gè)數(shù)據(jù)庫連接調(diào)用begin_transaction。

 

Rspec的數(shù)據(jù)庫事務(wù):如何清理陳舊數(shù)據(jù)?

 

 

Rails 4的setup_fixtures

 

在teardown_fixtures函數(shù)中,Rails為每個(gè)數(shù)據(jù)庫連接調(diào)用rollback_transaction。

 

Rspec的數(shù)據(jù)庫事務(wù):如何清理陳舊數(shù)據(jù)?

 

 

Rails 4的teardown_fixtures

 

這也意味著,如果在應(yīng)用程序中使用多個(gè)數(shù)據(jù)庫,那么應(yīng)用程序?qū)樗袛?shù)據(jù)庫創(chuàng)建事務(wù)。

在示例之外創(chuàng)建的數(shù)據(jù)庫記錄將不會(huì)回滾

由于數(shù)據(jù)庫事務(wù)圍繞著每個(gè)示例,因此在示例范圍之外創(chuàng)建的任何數(shù)據(jù)庫記錄都不會(huì)回滾,也就是說,在before(:all)、before(:context)或before(:suite)代碼塊中創(chuàng)建的任何數(shù)據(jù)庫記錄都不會(huì)回滾。

這可能導(dǎo)致示例組之間而不是同一組的示例之間的競(jìng)態(tài)條件,因此處理hook問題時(shí)要十分小心。

  1. context'context 1'do 
  2.           before(:context) do 
  3.             create(:user) # WON'T BE ROLLED-BACK 
  4.           end 
  5.                beforedo 
  6.             create(:user) # will be rolled-back 
  7.           end 
  8.                # ... 
  9.         end 
  10.              context'context 2'do 
  11.           before(:context) do 
  12.             create(:user) # WON'T BE ROLLED-BACK 
  13.           end 
  14.                # ... 
  15.         end 
  16.              # BY NOW, THERE ARE 2 USER RECORDS COMMITED TO DATABASE 

手動(dòng)設(shè)置數(shù)據(jù)庫事務(wù)

你還可以選擇使用hook手動(dòng)設(shè)置數(shù)據(jù)庫事務(wù)。

  1. RSpec.configuredo |config| 
  2.                   config.use_transactional_fixtures=false# DISABLE DEFAULT TRANSACTIONS 
  3.                 end 
  4.              before(:example) do 
  5.                   ActiveRecord::Base.connection.begin_transaction 
  6.                 end 
  7.              after(:example) do 
  8.                   conn =ActiveRecord::Base.connection 
  9.                   conn.rollback_transactionif conn.transaction_open? 
  10.                 end 
  11.              # OR 
  12.              around(:example) do |example| 
  13.                   ActiveRecord::Base.transactiondo 
  14.                     example.run 
  15.                            # ROLLBACK after the example finishes. 
  16.                     # This exception is silently swallowed by ActiveRecord. 
  17.                     raiseActiveRecord::Rollback 
  18.                   end 
  19.                 end 

[Rails 4 & Rails 5.0.x]數(shù)據(jù)庫事務(wù)是按線程執(zhí)行的

 

Rspec的數(shù)據(jù)庫事務(wù):如何清理陳舊數(shù)據(jù)?

 

 

Rails 4中的數(shù)據(jù)庫連接

 

由上可知,ActiveRecord數(shù)據(jù)庫連接是按線程執(zhí)行的。因此,Rails通過use_transactional_fixtures管理的默認(rèn)數(shù)據(jù)庫事務(wù)只在主線程中可用。

從技術(shù)上說,根據(jù)事務(wù)回滾策略,一個(gè)線程的數(shù)據(jù)庫記錄將獨(dú)立于其他線程。需要訪問其他線程中的某個(gè)線程的數(shù)據(jù)庫數(shù)據(jù)時(shí)請(qǐng)注意這一點(diǎn),例如Selenium。

[Rails 4 & Rails 5.0.x]JavaScript驅(qū)動(dòng)程序(Selenium)和Capybara Webkit的驗(yàn)收測(cè)試問題。

Selenium在另一個(gè)線程上運(yùn)行,因此它不能與運(yùn)行RSpec的主線程共享事務(wù)。為了讓客戶端應(yīng)用程序訪問數(shù)據(jù)庫中的數(shù)據(jù),RSpec需要將改動(dòng)提交。這類情況下可以允許提交數(shù)據(jù),然后手動(dòng)清理數(shù)據(jù)。

[Rails 4 & Rails 5.0.x]DatabaseCleaner——回滾策略

要解決上述問題,首先需要禁用Rails派生的事務(wù),將config.use_transactional_fixtures設(shè)置為false,或干脆刪除它。DatabaseCleaner是一個(gè)gem,它提供了清理數(shù)據(jù)庫的高級(jí)策略,例如刪節(jié)、事務(wù)處理或刪除。

下面是利用DatabaseCleaner處理上述JS驅(qū)動(dòng)程序問題的著名gist:

Rspec的數(shù)據(jù)庫事務(wù):如何清理陳舊數(shù)據(jù)?

[從Rails 5.1起]數(shù)據(jù)庫事務(wù)在測(cè)試線程之間共享

線程之間的共享數(shù)據(jù)庫事務(wù)由Rails團(tuán)隊(duì)的Eileen完成,并作為Rails 5.1的一部分內(nèi)容發(fā)布。

 

 

Rspec的數(shù)據(jù)庫事務(wù):如何清理陳舊數(shù)據(jù)?

 

 

加入了lock_thread

 

Rspec的數(shù)據(jù)庫事務(wù):如何清理陳舊數(shù)據(jù)?
為測(cè)試啟用了lock_thread

此更新允許將啟用JS的驗(yàn)收測(cè)試封裝在RSpec的默認(rèn)事務(wù)中,這已經(jīng)消除了對(duì)DatabaseCleaner的需求。

希望本文能幫助你更好地理解RSpec中的數(shù)據(jù)庫事務(wù)。

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2015-03-31 10:26:01

數(shù)據(jù)庫數(shù)據(jù)庫事務(wù)

2009-09-24 14:12:22

Hibernate數(shù)據(jù)

2010-10-08 09:38:55

Android數(shù)據(jù)庫事

2025-04-08 06:00:00

2018-07-20 11:10:21

數(shù)據(jù)庫事務(wù)隔離性

2023-10-11 08:09:53

事務(wù)隔離級(jí)別

2024-01-18 09:43:11

MySQL數(shù)據(jù)庫

2010-04-15 08:57:29

Oracle數(shù)據(jù)庫

2010-07-05 17:41:37

SQL Server

2024-05-28 00:00:30

Golang數(shù)據(jù)庫

2017-08-22 17:10:45

數(shù)據(jù)庫MySQL事務(wù)模型

2024-04-08 10:11:15

MYSQL數(shù)據(jù)庫事務(wù)

2010-09-08 15:55:20

SQL事務(wù)特性

2020-06-17 16:56:36

數(shù)據(jù)庫MySQL跨行事務(wù)

2009-08-06 18:10:06

C#數(shù)據(jù)庫事務(wù)

2011-08-12 13:33:31

Oracle數(shù)據(jù)庫自治事務(wù)

2010-05-31 15:12:44

MySQL數(shù)據(jù)庫

2018-09-06 14:53:39

數(shù)據(jù)庫事務(wù)隔離隔離級(jí)別

2022-11-14 18:23:06

亞馬遜

2018-07-17 10:58:45

數(shù)據(jù)庫數(shù)據(jù)庫事務(wù)隔離級(jí)別
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)