成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Rspec的數據庫事務:如何清理陳舊數據?

數據庫 其他數據庫
測試用例之間的陳舊數據是RSpec中競態條件的主要原因之一,包括數據庫Redis、文件等。本文就將討論如何清理數據庫中的陳舊數據。

本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。

測試用例之間的陳舊數據是RSpec中競態條件的主要原因之一,包括數據庫Redis、文件等。本文就將討論如何清理數據庫中的陳舊數據。

Rails Rspec后臺默認事務

如果使用rails-rspec,默認情況下,spec/rails_helper.rb中會啟用以下配置:

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

這意味著“在事務內運行每個示例”,即在示例結束時,所有數據庫的變更都將回滾。

如何讓“事務裝置”實現“在事務內運行每個示例”?

在深入研究Rails 4代碼庫,了解了它在后臺的實際工作之后,我發現了以下內容。setup_fixtures函數中,Rails為每個數據庫連接調用begin_transaction。

 

Rspec的數據庫事務:如何清理陳舊數據?

 

 

Rails 4的setup_fixtures

 

在teardown_fixtures函數中,Rails為每個數據庫連接調用rollback_transaction。

 

Rspec的數據庫事務:如何清理陳舊數據?

 

 

Rails 4的teardown_fixtures

 

這也意味著,如果在應用程序中使用多個數據庫,那么應用程序將為所有數據庫創建事務。

在示例之外創建的數據庫記錄將不會回滾

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

這可能導致示例組之間而不是同一組的示例之間的競態條件,因此處理hook問題時要十分小心。

  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 

手動設置數據庫事務

你還可以選擇使用hook手動設置數據庫事務。

  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]數據庫事務是按線程執行的

 

Rspec的數據庫事務:如何清理陳舊數據?

 

 

Rails 4中的數據庫連接

 

由上可知,ActiveRecord數據庫連接是按線程執行的。因此,Rails通過use_transactional_fixtures管理的默認數據庫事務只在主線程中可用。

從技術上說,根據事務回滾策略,一個線程的數據庫記錄將獨立于其他線程。需要訪問其他線程中的某個線程的數據庫數據時請注意這一點,例如Selenium。

[Rails 4 & Rails 5.0.x]JavaScript驅動程序(Selenium)和Capybara Webkit的驗收測試問題。

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

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

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

下面是利用DatabaseCleaner處理上述JS驅動程序問題的著名gist:

Rspec的數據庫事務:如何清理陳舊數據?

[從Rails 5.1起]數據庫事務在測試線程之間共享

線程之間的共享數據庫事務由Rails團隊的Eileen完成,并作為Rails 5.1的一部分內容發布。

 

 

Rspec的數據庫事務:如何清理陳舊數據?

 

 

加入了lock_thread

 

Rspec的數據庫事務:如何清理陳舊數據?
為測試啟用了lock_thread

此更新允許將啟用JS的驗收測試封裝在RSpec的默認事務中,這已經消除了對DatabaseCleaner的需求。

希望本文能幫助你更好地理解RSpec中的數據庫事務。

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2015-03-31 10:26:01

數據庫數據庫事務

2010-10-08 09:38:55

Android數據庫事

2009-09-24 14:12:22

Hibernate數據

2025-04-08 06:00:00

2024-01-18 09:43:11

MySQL數據庫

2018-07-20 11:10:21

數據庫事務隔離性

2023-10-11 08:09:53

事務隔離級別

2024-05-28 00:00:30

Golang數據庫

2010-04-15 08:57:29

Oracle數據庫

2010-07-05 17:41:37

SQL Server

2024-04-08 10:11:15

MYSQL數據庫事務

2010-09-08 15:55:20

SQL事務特性

2020-06-17 16:56:36

數據庫MySQL跨行事務

2017-08-22 17:10:45

數據庫MySQL事務模型

2022-11-14 18:23:06

亞馬遜

2018-09-06 14:53:39

數據庫事務隔離隔離級別

2010-05-31 15:12:44

MySQL數據庫

2013-08-06 09:33:28

英特爾數據中心淘汰

2009-08-06 18:10:06

C#數據庫事務

2011-08-12 13:33:31

Oracle數據庫自治事務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品揄拍一区二区久久国内亚洲精 | 91精品国产乱码久久久久久 | 亚洲福利一区 | 91美女在线观看 | 免费在线观看一区二区 | 国产一区不卡 | 在线观看国产91 | 一区二区三区在线免费观看 | 婷婷久久五月天 | 在线日韩欧美 | 亚洲一区二区三区在线 | 日本高清精品 | 国产在线一区二 | 亚洲国产欧美国产综合一区 | 国产一区高清 | 草草视频在线免费观看 | 99视频在线免费观看 | 日本电影网站 | 成人免费视频在线观看 | 日本久草视频 | 欧美一级一| 最新av片| 日本久久久久久久久 | 欧美人成在线视频 | 欧美高清视频 | 午夜不卡福利视频 | 久久婷婷国产香蕉 | 成人精品免费 | 色视频网站免费 | 91九色在线观看 | 国产精品a久久久久 | 国产高清精品在线 | 操人网站| 国产精品久久久久久一区二区三区 | 99热这里| 中文福利视频 | 夜夜久久 | 日韩精品视频在线 | 久草www | 在线不卡视频 | 日本黄色免费大片 |