Software

Latest comments

Railsで複数のセッションを用いたintegration testを行う方法

wakairo @wakairo
Last edited

別々のブラウザから複数のユーザがログインするような状況を再現したintegration testを実装しようとするときなど、 ユーザごとにセッションが必要になるなどして、 1つのテスト内で複数のセッションが必要になることがあります。

Ruby on Railsのintegration testでは、 標準でこのような複数のセッションを用いるテストに対応しており、 公式ドキュメントの中では、ActionDispatch::IntegrationTestのAPIドキュメントに説明があります。

複数のセッションを用いたintegration testの例

公式情報は上述のAPIドキュメントをご覧いただければと思いますが、一応こちらでも簡単な例を使ってintegration testで複数のセッションを用いる方法をご紹介します。

ここではテスト内容として、ログインしているユーザが列挙されるページをテストすることを想定してテストコードを考えます。 具体的には、ユーザ1がログインするとこのページにユーザ1が現れ、 続けてユーザ2がログインすると今度はユーザ1とユーザ2の両方がページに現れることを確認します。

シンプルにopen_session()でセッションを作って用いる場合の例

複数のセッションを用いる場合に鍵となるメソッドは、open_session()です。 このメソッドはセッションのオブジェクト返しますので、必要なセッションの回数分呼び出せば、必要な数のセッションが作成出来ます。 セッションを複数作成したら、各セッションのオブジェクトのインスタンスメソッドとしてget()やassert_response()を呼び出すことで、 セッションを指定してアクションやアサーションを実行できます。

以下にサンプルコードを示します。

require "test_helper"

class MultipleSessionTest < ActionDispatch::IntegrationTest

  test "login users page" do
    user1 = users(:one)
    user2 = users(:two)

    sess1 = open_session
    sess2 = open_session

    sess1.get login_path
    sess1.assert_response :success
    sess1.post login_path,
               params: { {email: user1.email,
                          password: user1.password} }
    sess1.assert_response :found
    sess1.assert_redirected_to root_path
    sess1.follow_redirect!

    sess1.get login_users_path
    sess1.assert_response :success
    assert_match /@#{user1.username}/, sess1.response.body
    assert_no_match /@#{user2.username}/, sess1.response.body

    sess2.get login_path
    sess2.assert_response :success
    sess2.post login_path,
               params: { {email: user2.email,
                          password: user2.password} }
    sess2.assert_response :found
    sess2.assert_redirected_to root_path
    sess2.follow_redirect!

    sess1.get login_users_path
    sess1.assert_response :success
    assert_match /@#{user1.username}/, sess1.response.body
    assert_match /@#{user2.username}/, sess1.response.body
  end
end

繰り返される処理をDSLのメソッドにまとめる例

上述のシンプルな例を見てみると、ログイン処理などで、対象とするセッションは異なるものの、ほぼ同じ処理が繰り返されていることが分かります。 こういった繰り返される処理は、特定のテストで用いるセッションのDSL (Domain-Specific Language) としてまとめることが出来ます。

以下のテストコードは、テストの手順や内容は上述のシンプルな例と同じですが、今度はこのDSLを用いてコードの繰り返しを排除したものになっています。なお、テストコードの読みやすさの観点でも、こちらの例の方が良くなっているのではないでしょうか。

require "test_helper"

class MultipleSessionWithDSLTest < ActionDispatch::IntegrationTest

  test "login users page" do
    user1 = users(:one)
    user2 = users(:two)

    sess1 = open_session_with_dsl
    sess2 = open_session_with_dsl

    sess1.login(user1)

    sess1.get_login_users
    assert_match /@#{user1.username}/, sess1.response.body
    assert_no_match /@#{user2.username}/, sess1.response.body

    sess2.login(user2)

    sess1.get_login_users
    assert_match /@#{user1.username}/, sess1.response.body
    assert_match /@#{user2.username}/, sess1.response.body
  end

  private

    module CustomDsl

      def login(user)
        get login_path
        assert_response :success
        post login_path,
               params: { {email: user.email,
                          password: user.password} }
        assert_response :found
        assert_redirected_to root_path
        follow_redirect!
      end

      def get_login_users
        get login_users_path
        assert_response :success
      end
    end

    def open_session_with_dsl
      open_session do |sess|
        sess.extend(CustomDsl)
      end
    end
end
0
Raw
https://www.techtips.page/en/comments/313
❤️1

Ruby on Railsのサポート終了日(各バージョンのEOL)

wakairo @wakairo
Last edited

railsの各バージョンについて、セキュリティアップデートが行われる期限(End-of-Life)は以下の通りです。

  • 8.1.x - 2027/10/10
  • 8.0.x - 2026/11/07
  • 7.2.x - 2026/08/09

7.1以前のバージョンは、以下の通りサポートが終了しています。

  • 7.1.x - 2025/10/01

なお、railsのサポート期間に関するより詳細な情報については本家のメンテナンス・ポリシーを参照してください。

0
Raw
https://www.techtips.page/en/comments/309
🔧6
😄3
❤️3
💯1

meta-tags側のtruncateでは、スペース文字のところで切り詰めが行われます

wakairo @wakairo
Last edited

meta-tagsのv2.21.0で'truncate_on_natural_separator'の設定が追加されました。この設定を利用することで、スペース文字のところでの切り詰めを回避できるようになりました。このことを上のコメントに反映しました。

0
Raw
https://www.techtips.page/en/comments/306
😄1
🔄1
🔧1

WingetUIはv3.1からUniGetUIに名称が変更されました

wakairo @wakairo

winget以外のパッケージ・マネジャーも多数サポートするようになってきたため、WingetUIをUniGetUIにちかぢか名称変更しますというアナウンスメントが2024/03/13に出ていました。

2024/07/03にバージョン3.1がリリースされ、リリース名が初めてUniGetUIになりましたので、名称変更が完了したものと思われます。

なお、バージョン3.0のリリースではWingetUIという名称でした。

0
Raw
https://www.techtips.page/en/comments/305
🔧1
💯1

activerecordでは、firstを使った方が実装とSQLが揃って可読性が上がる

takuma_tech Takuma @takuma_tech

こちらの記事によると、activerecordでlastを使った場合、指定したorderを逆にして"LIMIT 1"とするSQLが発行されるそうです。

一方で、firstを使った場合、指定したorderはそのままで"LIMIT 1"とするSQLとなるので、railsのコードとSQLの対応関係が分かりやすくなります。

したがって、lastよりもfirstを使った方が実装とSQLが揃って可読性が上がるということがこの記事で主張されていました。 ご参考まで。

0
Raw
https://www.techtips.page/en/comments/304
🔧1
💡1
❤️1

WingetUIにおいてVCRedistのアップデート通知が繰り返される問題とその解決策

wakairo @wakairo

問題

WingetUIにおいて、Visual C++ 再頒布可能パッケージ(Microsoft.VCRedist.2015+.x64)がアップデート可能であると通知されるので、WingetUIからアップデート操作をして成功と表示されたにもかかわらず、すぐにまたアップデートが可能であると通知されることが繰り返されました。

どうやら、アップデート成功という表示は嘘のようで、実際にはWingetUIからこのVCRedistのアップデートには成功していなかった模様です。

解決策

コマンドプロンプトから以下のコマンドを実行したところ、アップデート通知が繰り返されることはなくなりました。

winget upgrade Microsoft.VCRedist.2015+.x64

つまり、WingetUIからアップデートが上手く行かないときは直接wingetでアップデートすると問題が解決することがあるようです。

参考

本件と関係するかは分かりませんが、以前のコメントにあるように、かつてWingetUIのインストールにおいて"Microsoft.VCRedist.2015+.x64"に関連するエラーが存在していました。

0
Raw
https://www.techtips.page/en/comments/303
😄1
🔄1
😿1

Pythonライブラリの作成に関する公式情報

kenicode SatoKen @kenicode

pyproject.toml[build-system]の指定が、サンプルプロジェクトではsetuptoolsである一方、チュートリアルではデフォルト扱いがhatchlingになっていて、両者で違いがあって興味深いですね。 公式(PyPA)としては、setuptoolsがまだまだ現役であることを認めつつ、今後はhatchlingを推していきたいということなのかな?

0
Raw
https://www.techtips.page/en/comments/300

Pythonライブラリの作成に関する公式情報

wakairo @wakairo
Last edited

なるほど、Pythonのパッケージングに関して、公式情報に相当する情報があるのですね。勉強になります。

それから、言及されているチュートリアルとサンプルプロジェクトのどちらも設定を書くのがsetup.pyではなくpyproject.tomlなのですね。 自分でも少し調べてみたのですが、python.orgにあるガイドには、「(パッケージングの設定には)pyproject.tomlファイルを使うのが標準的な慣習です。」と書いてあり、Zennの記事でも「現在でも歴史的経緯から setup.py のみで設定を行っているプロジェクトは多く存在しますが、このような構成は現在では非推奨」、「setup.pyを設定ファイルの一部として用いる場合であってもpyproject.tomlは配置するのが現在の標準的なセットアップ方法」と書いてある記事を見つけました。

どうやら、Pythonパッケージにはpyproject.tomlを用意すべし、pyproject.tomlを起点にしてPythonパッケージをビルドすべし、というのが公式見解のようですね。コマンドラインからsetup.pyを直接実行するやり方はlegacy、つまり、廃止予定とのことですし。

0
Raw
https://www.techtips.page/en/comments/299
🙋1

Pythonライブラリの作成に関する公式情報

takuma_tech Takuma @takuma_tech

Pythonのライブラリを自作するときに、フォルダ構成や設定ファイルの書き方について知りたくなることがあります。ライブラリを公開するかどうかやどの程度きっちり作るかなど状況は様々だと思いますが、ソフトウェアの規模が大きいときやあちこちから呼び出す関数を整備するときなどに、ライブラリやライブラリに準じるものを作成することはよくあることだと思います。そういうときにどういう作り方が行儀の良いやり方なのかを探していて見つけた情報が以下のものです。

Python公式サイトのパッケージングに関するチュートリアル

https://packaging.python.org/ja/latest/tutorials/packaging-projects/

Pythonの公式サイトである「python.org」に置いてある文書ですので、信頼できる情報なのだと思います。

PyPAのサンプルプロジェクト

https://github.com/pypa/sampleproject

Pythonでのパッケージングに関するとりまとめを行っている組織であるPyPAが出しているサンプルですので、信頼できるのではないかと思います。

0
Raw
https://www.techtips.page/en/comments/298
🔧1