Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ: Railsのシステムテストを単体テストに置き換えるほか(20240627後編)

こんにちは、hachi8833です。Rails 7.2.0のマイルストーンのissueが今日になって全部クローズされました↓。

参考: 7.2.0 Milestone

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やX.comでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙏

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

🔗Rails

🔗 RubyConf 2024登壇者募集(Rails公式ニュースより)


つっつきボイス:「今年のRubyConfは米国シカゴのヒルトン・ダウンタウンで開催なのね🎉」「11/13〜11/15ということはKaigi on Railsの1か月くらい後ですね」「Early birdsは7/31までか」

参考: Kaigi on Rails 2024

🔗 システムテストを単体テストに置き換える(Ruby Weeklyより)


つっつきボイス:「RSpec本でお馴染みのEverydayRailsの記事で、冒頭にDHHによる以下の記事が引用されていました↓」

参考: System tests have failed

「Railsへのシステムテスト導入が失敗だったという例の記事ですね: 別に騒ぐほどのものではなくて、単にシステムテストをどう位置づけるかという話だと思っています」「というと?」「システムテストはE2Eテストと位置づけるということでいいのではと思いますが、E2EテストをシステムテストとしてRailsのテストの一環として作るべきなのかはプロジェクトの構成などによっても変わってくるでしょうね」「DHHの記事でもHEYのシステムテストを全廃するのではなくシステムテストの数を減らしているところだと書かれていますね」「そうそう、E2E系のテストはゼロにする必要はなくても、本質的に時間がかかるので減らすに越したことはないし、最近だとそれ用の外部サービスを使うことも増えているようですね」

「そもそもE2Eテストをコードで実行するのがよいのかという議論もあるんですよ: アプリケーションが既にブラウザで表示して動く状態なら、E2EテストはQA担当者が手動でUIを動かしながら行う形で定義する方が、本来E2Eでテストしたい"ユーザーが実際に動かしたときに期待どおりに動作するか"のテストという視点では、より適切かもしれないとも思います」「そういえばDHHの記事にもそう書かれていましたね」

「コードによるE2Eテストだけだとエンジニアが定義しなかった項目が拾えなくなるし、E2Eテストのすべてをコードで網羅しても大変な割にあまり報われなさそう」「E2Eテストの数を増やせばテストの実行は重くなる一方だし、レンダリングタイミングの問題などで不安定なテストも増えてしまいますね」「システムテストを減らして単体テストを増やすなら、ユーザー観点の問題を見落とさないためにも、その分手動によるテストも実施するなどして、最低限正常系だけでもE2Eテストのサービスなどを利用してチェックを実施すべきでしょうね」「要するにシステムテストは増やすとしんどくなる」

🔗 rspec-wait: RSpecでウェイト処理(Ruby Weeklyより)

laserlemon/rspec-wait - GitHub


つっつきボイス:「RSpecのexpectwait_forに置き換える形でテストにウェイトをかけられるそうです」「お、これはシステムテストなどでJavaScriptコードの実行待ちをしたいときなんかに昔から非常によく使われるパターンですね」

# 同リポジトリより
RSpec.describe Ticker do
  subject(:ticker) { Ticker.new("foo") }

  describe "#start" do
    before do
      ticker.start
    end

    it "starts with a blank tape" do
      expect(ticker.tape).to eq("")
    end

    it "sends the message in Morse code one letter at a time" do
      wait_for { ticker.tape }.to eq("··-·")
      wait_for { ticker.tape }.to eq("··-· ---")
      wait_for { ticker.tape }.to eq("··-· --- ---")
    end
  end
end

「予想通り、wait_timeoutもコンフィグで指定できるようになっている↓」

# 同リポジトリより
RSpec.configure do |config|
  config.wait_timeout = 3 # seconds
  config.wait_delay = 0.5 # seconds
  config.clone_wait_matcher = true
end

🔗 Bundlerのauto_install trueRuby Weeklyより)


つっつきボイス:「bundlerでauto_install trueというコンフィグがあるそうです」「あ〜なるほど、bundle install実行時に入っていないgemがある場合に自動インストールするところまでインストールされていないgemがある場合に自動的にbundle installするところまでやってくれるんですね」「早速自分の環境にも設定しました」

# 同記事より
bundle config auto_install true
# or
bundle config --global auto_install true

「開発環境ではこの機能をonにしておくと便利だと思いますが、production環境などでは用心しておく方がよいでしょうね」「何かリスクがあるんでしょうか?」「Gemfileが何かの脆弱性で書き換え可能になってしまうといった条件が絡んでくると、自動Gemインストール時に任意スクリプトを実行するような悪意のあるgemとかと組み合わせて悪さができるかもしれないので、production環境ではoffにしておくのが良いと思います」「なるほど」

🔗Ruby

🔗 Ruby 3.4リリースまでは構文の変更を控える(Ruby Weeklyより)


つっつきボイス:「これもRuby Weeklyの記事です」「お、パーサー周りの開発を優先するために3.4リリースまではバグ修正を除いて構文の変更は控えるんですね、これは理解できる」「RubyKaigiのクロージングキーノートでも話していました」「シンタックスモラトリアムという言い方がちょっと面白い」

🔗 Graceful.Dev: Rubyを学ぶサイト


つっつきボイス:「このRuby自習サイトはzverokさんの記事で引用されていたのを見て知りました↓」「Ruby本をいろいろ出版しているAvdi Grimmさんが中心になって作ったのね」

参考: The design decisions and evolution of a method definition - Ruby case study

「まだサイトのつくりがよくわからないけど、無料で読めるものもあるようです↓」「個別のコースは比較的軽めに作ってある感じ、意欲のある人はどうぞ👍」

🔗 (提案)デフォルトのパーサーをPrismにする(Ruby Weeklyより)


つっつきボイス:「Ruby 3.4がリリースされる前にPrismをデフォルトパーサーにしてプレビュー可能にしようという提案らしい: さすがに3.4リリースでよいのではという気はしますけどね」「Matzは3.4のプレビューでPrismをデフォルトにすることについては賛成していて、リリースするかどうかは品質次第という考えなのね」

Prismについて詳しくは同じKevin Newtonさんの以下の記事もどうぞ↓。

Ruby: 2024年までのPrismパーサーの長い歴史を振り返る(翻訳)


後編は以上です。

バックナンバー(2024年度第2四半期)

週刊Railsウォッチ: Active Recordにstrict_loading_mode追加、to_time_preserves_timezoneの扱いほか(20240625前編)

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。

Rails公式ニュース

Ruby Weekly


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。