1. tanaken on Rails
  2. #044: Rails 8.0, Action Cont..
2024-11-10 08:41

#044: Rails 8.0, Action Controller Guide, skip_transactional_tests_for_database

サマリー

Rails 8.0のリリースが発表され、新機能や改善点が紹介されています。また、ActiveRecordにおけるトランザクショナルテストの設定をデータベースごとに制御できる新しい機能についても説明されています。Rails 8.0の新機能やAction Controller Guideの詳細、さらにスキップ可能なトランザクショナルテストについて議論されます。

Rails 8.0の新機能
はい、こんにちは。第44回のtanaken on Railsです。
今週は、1つお知らせと2つプルリクエストを紹介します。
1つ目、お知らせ。
Rails 8.0がリリースされましたというお知らせで、
Rails 8.0コロンのパースリクワイヤードというブログが発表されています。
ベータバージョンのリリースが1ヶ月半くらい前、9月の22日くらいかな、
に発表されてから1ヶ月半くらい経ったんですかね。
正式バージョンのリリースがされたということで、
このブログに書かれている内容は次の通りでございます。
1つ目、Caml2によるデプロイとSlusterによるプロキシという話と、
あとは、Slit Cable、Solid Cache、Solid Queueを使うことによる依存の削減、
リリースに依存しなくなるねという話と、
SQLiteだけで全て動かすことができるようになっています。
それぞれアダプターがSQLiteにも対応している状態になったので、
MySQLとかBOSGREとか、そういうデータベースマネジメントシステムの利用も
オプショナルになるよということですね。
あとは、Sprocketsからプロップシャフトへの移行だったり、
基本的な認証の仕組みの提供とかも書かれています。
これまで、このただけオンリリースでも紹介してきた機能の話が
Kaitzmanで紹介されているという感じですね。
Rails 8使っていきましょう。
トランザクショナルテストの設定
Rails 8使っていきましょう。
続いてプルリクエスト2個のうちの1個目。
1個目は、タイトル読むか。
アクションコントローラーオーバービュー&アドバンスドトピックスガイド
というやつで、アクションコントローラーについてのガイドを更新するプルリクエストですね。
まだマージはされていなくて、
11月10日朝10時現在では、
まだマージされていなくて、フィードバックコメント募集中という感じなので、
ぜひ興味ある方はしてみてください。
最後、プルリクエスト2つ目。
Add support for disabling transactions per database in ActiveRecord
ということで、ActiveRecordに関する変更です。
ユーズトランザクショナルテストという設定を
データベースごとに上書きできるようになりました。
ユーズトランザクショナルテストについてはもともとあるもので、
これもあんまり僕は詳しくなかったので調べました。
まず前提としてそれについて、
Railsガイドのテストのショー、
テストのページ、テスティングこれなんだっけな。
待ってくださいね。
Railsテスティングガイドというページに
並列トランザクションをテストするといったトピックがあるんですけど、
その中とかで紹介されてますね。
ユーズトランザクショナルテストというのは、
データベースの変更をトランザクション内で行うかどうかを設定するオプションです。
通常はConfig.useTransactionalTestsというので、
Equal Trueという設定がされてます。
大体TestHelper.rbとかRailsHelper.rbとか、
そういうところでデフォルトでTrueで設定されています。
この設定がTrueのときは、
各テストケースがトランザクション内で実行されて、
テストが完了したらトランザクションがロールバックされる。
なのでデータがDBに残らないということですね。
なので、他のテストに影響するということを防ぐことができるというので、
基本Trueに設定されているので、
あんまりみんな意識することはないんじゃないかなというところですかね。
この設定をフォルスにしたいケースとしては、
例えば非同期ジョブを含むテストをしたいという場合、
テスト用のデータがトランザクション内で実行されて、
トランザクション内にあると、
つまりトランザクション内にあるとまだDBにコミットされていないので、
非同期ジョブをちゃんと別プロセスで動かしてテストしたいという場合には、
そのプロセスからはまだDBにデータがコミットされていない状態になっちゃうので、
データが見れない、アクセスできないということになりますよね、多分ね。
というケースがあるので、あえてこの設定をフォルスにして、
非同期ジョブを別プロセスで動かして、
DBからデータを取ってきて同行するというようなテストをしたいという時とか、
その他にも外部サービスとの何か兼ね合いで、
トランザクションをフォルスにしておくというようなケースとかもあるかもしれないですけど、
そういったケースでフォルスにすると。
全部フォルスにするんじゃなくて、
テストケースのクラス単位で上書きできるようになっていて、
例えばワーカーテストというクラスがあったとしましょうと。
アクティブサポートコロンコロンテストケースを継承したワーカーテストというクラスがあるとして、
そのクラス内で、self.useTransactionalTests="false".
という形で、このクラス内ではトランザクションは無効にしますよというように、
記載ができるというのが機能としてあります。
ここまでが既存のuseTransactionalTestsについての説明なんですけども、
今回のプレリクエストでは何が変わったかというと、
マルチデータベースを利用している前提で、
一部のデータベースだけトランザクションの利用をスキップしたいというケースに対応できるようになったと。
スキップトランザクショナルテストフォーデータベースというメソッドが新たに追加されています。
このメソッドの引数にデータベース名をシンボルに渡すと、
この指定したデータベースだけトランザクションをスキップするという動きになります。
例えば、このプレリクエストで紹介されていた例でいうと、
クラス、MostlyTransactionalTests ActiveSupportコロンコロンテストケースを継承した
MostlyTransactionalTestsというクラスがあるとしましょう。
Mostlyだからほとんどトランザクションを使うテストというクラス名ですね。
で、self.useTransactionalTestsはtrue。
基本的にはトランザクションを使いますよと有効にしますよ。
ただし、スキップトランザクショナルテストフォーデータベースには
sharedというデータベース名を指定すると。
sharedというデータベースに関してはトランザクションを無効にするけど、
それ以外はトランザクションを有効にします、このクラス内ではみたいな
そういう設定ができるようになってますということで。
マルチデータベースで何らかの理由で、
今回この例だとsharedだから何か共通のDBがあって
こいつはテスト内ではトランザクションはスキップせずに
ずっと残しておくっていうような、そういう使い方がしたいということなんですかね。
とかとかっていうことができるようになったよということでございます。
こんなところで今週の田中オンレールズは以上にしたいと思います。
レールズ8.0も出てね。
いよいよ新しくいろんなアプリケーションを作るというときには
Rails 8.0の機能
レールズ8が作れるようになったということで嬉しいですね。
では終わりにしたいと思います。また来週。バイバイ。
08:41

コメント

スクロール