Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

テスト環境でユーザーとアイコン画像が紐付けされるようにした #5096

Merged
merged 6 commits into from
Jul 17, 2022

Conversation

tomonariha
Copy link
Contributor

@tomonariha tomonariha commented Jun 28, 2022

Issue

概要

テスト環境と開発環境でユーザーとアイコン画像が紐付けされるようにした
参考issue:#4305

変更確認方法

準備

ブランチbug/link-userdata-and-images-in-test-environmentをローカルに取り込む

開発環境での確認

  1. rails db:resetでDBの再生成をする。
  2. bin/setupでDBに初期データを投入する。
  3. rails sでサーバーを起動する。
  4. 任意のユーザーでログインする。
  5. ユーザー>ユーザー一覧でユーザーとアイコン画像が紐付けされているか確認する。

変更前

スクリーンショット 2022-07-04 21 15 47

変更後

スクリーンショット 2022-07-04 21 17 15

テスト環境での確認

  1. コマンドラインでHEADED=1 rails test test/system/attachments_test.rbを実行し、ブラウザでのシステムテストを起動する。
  2. ユーザーアイコンが画像データと紐づいていることを確認する。
    ウィンドウが閉じるのが早くて確認しにくい場合は、test/system/attachments_test.rbにあるテストメソッドのvisit_with_auth〜の次の行にsleep 10などを挟む。

変更前

スクリーンショット 2022-06-28 23 48 36

変更後

スクリーンショット 2022-06-28 22 33 39

@tomonariha tomonariha force-pushed the bug/link-userdata-and-images-in-test-environment branch from c3d4b35 to 8961855 Compare June 29, 2022 13:33
@tomonariha tomonariha marked this pull request as ready for review June 30, 2022 14:31
@tomonariha
Copy link
Contributor Author

@tksmasaki さん、お疲れ様です。
masakiさんが以前調査されていたテスト環境の画像データのイシュー #4249 ですが、私の方で引き継ぎました。
詳しく調査されていて、とても参考になりました!(実は以前もnpmを参考にさせて頂いています🙇‍♂️)

今回、ぜひmasakiさんにこのイシューのレビューをお願いしたいと思い、ご連絡させていただきました。
ちなみにmasakiさんは既にチーム開発を終えられているので、レビューをお願いして良いかを駒形さん、町田さんにお話ししたところ、masakiさんが引き受けて下さるならOKとのことです。

お忙しいとは存じますが、お引き受けいただけると嬉しいです🙏

@tomonariha tomonariha requested a review from tksmasaki June 30, 2022 14:55
@tksmasaki
Copy link
Contributor

@tomonariha
PR作成ありがとうございます!
ぜひレビューさせていただきます!2〜3日以内にはお返しするので、少々お待ちください🙏

@tomonariha
Copy link
Contributor Author

@tksmasaki さん、ありがとうございます!
急ぎませんので、お時間のある時に見ていただければと思います🙇‍♂️

Copy link
Contributor

@tksmasaki tksmasaki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tomonariha
いくつかコメントしました!ご確認よろしくお願いします!

また、レビューとは別のことになるのですが、
システムテストをブラウザで目視しながら動かしたい場合は、bootcamp の README に HEADED=1 rails test のようにして HEADEDtrue にする方法が書いてあるので、そっちに合わせたほうが他の方に伝える場合などは都合がいいかも?と思いました。(やりたいことはコード上で値を直接 true にしても同じなので、どっちでもいいとは思います🙏)
README のテストの項目

@@ -34,3 +34,22 @@ class ActionDispatch::IntegrationTest
ActiveSupport.on_load(:action_dispatch_system_test_case) do
ActionDispatch::SystemTesting::Server.silence_puma = true
end

# Rails 7 の ActiveStorage::FixtureSet.blob と同様の機能を実装
# Pull Request #4182 「Update rails 7.0.2.2」の完了後に削除する
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

現在は 7.0.3 へのアップデートになっていますね。
Pull Request #4182 での Rails 7 へアップデート完了後に削除する などにした方がアップデートするマイナーバージョンが変わっても正確な内容になっていいかもしれないです🤔
また、PRのURLをコメントで貼っておいてもいいかもしれないです!(僕がサンプルで書いた時は貼ってなかったですね...🙏)

Copy link
Contributor Author

@tomonariha tomonariha Jul 4, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

いつの間にかマイナーバージョン上がってますね🤔
マイナーバージョンの記載をやめて、PRへのリンクを記載するようにしてみました。
2512d0d

@@ -0,0 +1,24 @@
# Pull Request #4182 Update rails 7.0.2.2 の完了後、ActiveStorage::FixtureSet.blob を使うように変更する
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

現在は 7.0.3 へのアップデートになっていますね。
Pull Request #4182 での Rails 7 へアップデート完了後に削除する などにした方がアップデートするマイナーバージョンが変わっても正確な内容になっていいかもしれないです🤔
また、PRのURLをコメントで貼っておいてもいいかもしれないです!(僕がサンプルで書いた時は貼ってなかったですね...🙏)

test_helper.rb に書いたコメントと同様です!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

同じくマイナーバージョンの記載をやめて、PRへのリンクを記載するようにしてみました。
2512d0d

# frozen_string_literal: true

require 'application_system_test_case'

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このテストは Rails 7 へのアップデートが完了後、デフォルトの機能で fixture の画像をアタッチするようになったら不要になるかなと思うので、他の変更箇所にあるコメントと同じようにその旨を書いておくといいかもなと思いました!

Copy link
Contributor Author

@tomonariha tomonariha Jul 4, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確かにコメントがあった方がいいですね!
Rails7移行後のためのコメントを記載するようにしました。
2512d0d

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コメントの対応ありがとうございます!

他の変更箇所にあるコメントと同じようにその旨を書いておく

僕のこの書き方が悪くて申し訳ないのですが...🙇‍♂️

ActiveStorage::FixtureSet.blob を使うように変更する というコメントではなく、テスト自体(このファイルごと)不要になることを書いた方が適切かなと思いました。
現在は Rails 7 から使えるようになる機能を自作で書いているので、テストで確認するのは良いと思うのですが、Rails 7 へアップデートで ActiveStorage::FixtureSet.blob を使うようになると、gem の機能をわざわざテストすることになるので不要になるといった考えです(何か勘違いしていたらすみません...)

テストのプラクティスの説明にあった以下の内容のケースに当てはまるかなと思ってます。

modelのvalidationなど、railsの機能、gemの機能をテストしてしまう。(gemのテストはgemの中でそれぞれやってるので必要ない)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rails7移行後でもアタッチのテストは必要かな?と思っていましたが、確かにActiveStorage::FixtureSet.blobでアタッチすればrailsの機能ということでテストはいらないですね。
理解が悪くて申し訳ないです🙇‍♂️
テストを削除するよう記述を変更しました。8512b43


tanaka_avatar_blob: <%= ActiveStorage::Blob.fixture filename: "users/avatars/tanaka.jpg" %>

yameo_avatar_blob: <%= ActiveStorage::Blob.fixture filename: "users/avatars/yameo.jpg" %>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

現在、test/fixture/files には companies と users 以外に、

  • articles/ogp_images/test.jpg
  • practices/ogp_images/1.jpg

がありますが、これらはセットアップ時にアタッチしなくてよい画像でしょうか?
これらの画像の用途を把握できていないのですが、test/fixture/files 以下に扱いが異なるファイルがあるのが気になったので、確認できたらいいなと思いました!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#4249 の方で2つの画像ファイルについて質問しました。
komagataさんからご回答いただき、

アップロードのテストに使っているやつかもです。そうであればアタッチする必要はありません。(その辺りのテストを確認してみてください)

とのことです。
これらの画像の用途としては、
test/system/articles_test.rb
test/system/practices_test.rb
test/system/practice/completion_test.rb
で画像のアップロードのテストに使われているだけなので、アタッチの必要はなさそうです。

@tomonariha
Copy link
Contributor Author

@tksmasaki さん、レビューありがとうございます😄
今、イシューの方でkomagataさん達に画像のアタッチについて確認しています。
そちらの回答をいただいてから変更を反映いたしますので、もうしばらくお待ち下さい🙇‍♂️

@tomonariha
Copy link
Contributor Author

tomonariha commented Jul 4, 2022

@tksmasaki さん、お待たせしました🙇‍♂️
コメントいただいた点へ対応しましたので、お手隙の際にご確認お願いします🙏

また、#4249 にてkomagataさんより、

別件ですが、DBの方は今回のIssueで画像が投入されるようになるかんじでしょうか。(rails db:seedでdevelopment環境に画像が入る)
どちらかというとこちらが主目的なので、問題がなければお願い致します〜

とのことなので、development環境でも画像がアタッチされるように変更しました。7b39699
お手数ですが、併せてこちらの確認もお願いします🙏(上の変更確認方法に開発環境での確認方法を追記しておきました)

あと、GUIのシステムテストをHEADED=1 rails testでするように変更しました。こちらの方がコードをいじらなくていいし、圧倒的にいいですね!(READMEの記載を見逃していました😭)

Copy link
Contributor

@tksmasaki tksmasaki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tomonariha
修正ありがとうございます!
ささいなことなのですが、少しコメントしました。確認お願いします🙏

@@ -0,0 +1,59 @@
# Pull Request #4182(https://github.com/fjordllc/bootcamp/pull/4182) で Rails 7 への移行完了後、
# ActiveStorage::FixtureSet.blob を使うように変更する
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

attachments.yml の内容に関しては、blobs.yml で ActiveStorage::FixtureSet.blob を使うようになった場合でも内容は変わらないので、このコメントは不要かもなという気がしました。
画像データを登録する方法が変わってもこの fixture の記述に影響はないはずなので、今回の修正についてよくわかっていない状態でこのコメントを読むと、むしろ混乱するかもと個人的に思いました🤔

Copy link
Contributor Author

@tomonariha tomonariha Jul 6, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確かに attachments.yml については、 blobs.yml と違ってrails7移行後に変更するところはないですね。
ActiveStorage::FixtureSet.blob を使うように変更するってどういうこと?ってなりそうなので、コメントは削除しました。8512b43

# frozen_string_literal: true

require 'application_system_test_case'

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コメントの対応ありがとうございます!

他の変更箇所にあるコメントと同じようにその旨を書いておく

僕のこの書き方が悪くて申し訳ないのですが...🙇‍♂️

ActiveStorage::FixtureSet.blob を使うように変更する というコメントではなく、テスト自体(このファイルごと)不要になることを書いた方が適切かなと思いました。
現在は Rails 7 から使えるようになる機能を自作で書いているので、テストで確認するのは良いと思うのですが、Rails 7 へアップデートで ActiveStorage::FixtureSet.blob を使うようになると、gem の機能をわざわざテストすることになるので不要になるといった考えです(何か勘違いしていたらすみません...)

テストのプラクティスの説明にあった以下の内容のケースに当てはまるかなと思ってます。

modelのvalidationなど、railsの機能、gemの機能をテストしてしまう。(gemのテストはgemの中でそれぞれやってるので必要ない)

@tomonariha tomonariha force-pushed the bug/link-userdata-and-images-in-test-environment branch from 7b39699 to 8512b43 Compare July 6, 2022 03:44
@tomonariha
Copy link
Contributor Author

@tksmasaki さん、コメントありがとうございます!
コメントいただいた点の修正自体は終わっているのですが、CIのアタッチ関係と思われるテストがかなり不安定で通りにくい状況です。
原因を調べていますので、しばらくお待ちいただきますようお願いします🙇‍♂️

@tomonariha
Copy link
Contributor Author

@tksmasaki さん、大変お待たせしました🙇‍♂️
ようやくCIが通りましたので、ご確認よろしくお願いします!

Copy link
Contributor

@tksmasaki tksmasaki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tomonariha
修正ありがとうございます!LGTMです🙆

ちなみにCIが通りにくかったのは、このPRの修正の影響とは関係なかったですか?少し気になったのでよければ教えていただけるとありがたいです🙏

@tomonariha
Copy link
Contributor Author

@tksmasaki さん、ご確認ありがとうございます!
CIが通りにくかった件ですが、結論から言うとはっきりとしたことは分かりませんでした🙇‍♂️

今回、15回連続CI落ちる→色々調べてわからなかったので日を置いてもう1度CI通す→1回で通るという流れでした。
落ちたテストを見るとsystem/admin/companies_test.rbsystem/companies_test.rbのことが多いので、これらのテストをローカルで何回か走らせてみましたが、ほぼ通ります。
こちらはCIで落ちたテストログの一部です。

Error:
Admin::CompaniesTest#test_delete_company:
ActionView::Template::Error: ActiveStorage::FileNotFoundError
    app/models/company.rb:13:in `logo_url'
    app/views/admin/companies/_form.html.slim:20
    app/views/admin/companies/_form.html.slim:1
    app/views/admin/companies/edit.html.slim:18
rails test test/system/admin/companies_test.rb:41

このようにエラーログにlogo_urlの文字が見られることが大半だったので調べてみると、logo_urlというのはmodels/company.rbにあるCompanyクラスのメソッドでした。

# app>models>company.rb
def logo_url
  if logo.attached?
    logo.variant(resize: LOGO_SIZE).processed.url
  else
    image_url('/images/companies/logos/default.png')
  end
end

これを見るに、今回のPRでcompanyのロゴのアタッチが有効になる→logo_urlのif条件を満たしlogo.variant(resize: LOGO_SIZE).processed.urlが実行されるようになることがわかります。画像のリサイズは結構重い処理のようです。
また、15回テストが落ちた時はキューが貯まってたのかテストの開始が遅かったのですが、日を置いた後はすぐにテストが始まっていました。
これらのことから、CIでキューが貯まっているなど高負荷な状態では画像のリサイズが間に合わずにテストがエラーになる、ということだと予想しています。

ただ、確実なことは言えないので、この後issueかこのPRでkomagataさんにお知らせして判断を仰ごうと思っています。

@tksmasaki
Copy link
Contributor

tksmasaki commented Jul 9, 2022

@tomonariha
丁寧な説明ありがとうございます!
もしかしたら原因に関係あるかな? という内容があったのでリンク貼っておきます。
テスト中に作成したファイルを削除する (Active Storage の概要 - Railsガイド)

システムテストでは、トランザクションをロールバックすることでテストデータをクリーンアップしますが、destroyはオブジェクトに対して呼び出されないため、添付ファイルはそのままでは決してクリーンアップされません。 添付ファイルを破棄したい場合は、after_teardownコールバックで行えます。このコールバックを実行すると、テスト中に作成されたすべてのコネクションを確実に完了するので、Active Storageでファイルが見つからないというエラーは表示されなくなります。

エラー内容がActiveStorage::FileNotFoundErrorだったので、当てはまっていそうかもと思いました🤔
ただ、私もきちんとは調べられてはいないので、ひとまず参考までに確認お願いします。
(もしかしたら全く関係ないかもしれないので、そうだった場合は申し訳ないです...🙇‍♂️)

@tomonariha tomonariha force-pushed the bug/link-userdata-and-images-in-test-environment branch from 8512b43 to 41b5b02 Compare July 9, 2022 15:21
@tomonariha
Copy link
Contributor Author

@tksmasaki さん、情報ありがとうございます!
これは試してみる価値がありそうと思い、早速試してみました!

def after_teardown
  super
  FileUtils.rm_rf(ActiveStorage::Blob.service.root)
end

を組み込んで(41b5b02)、CIを走らせてみた結果、1102 runs, 2638 assertions, 2 failures, 46 errors, 0 skipsでした。
(以前15回テストに落ちた時はエラー数2〜10の範囲でした)
エラー内容は、46あるエラーは全て例のActionView::Template::Error: ActiveStorage::FileNotFoundErrorです。

Error:
AttachmentsTest#test_attachment_company_logo:
ActionView::Template::Error: ActiveStorage::FileNotFoundError
    app/models/company.rb:13:in `logo_url'
    app/views/companies/_profile.html.slim:7
    app/views/companies/show.html.slim:21
rails test test/system/attachments_test.rb:13

2つのFailureはどちらもテスト名以外は同じで

Failure:
CompaniesTest#test_GET_/companies:
--- expected
+++ actual
@@ -1 +1 @@
-"企業一覧 | FJORD BOOT CAMP(フィヨルドブートキャンプ)"
+""

と言う内容でした。

また、このafter_teardownを組み込むとローカルの方でもsystem/admin/companies_test.rbsystem/companies_test.rbsystem/users_test.rbで上記のエラーが再現するようになったので色々試してみて、logo_url

# app>models>company.rb
def logo_url
  if logo.attached?
    logo.variant(resize: LOGO_SIZE).processed.url
  else
    image_url('/images/companies/logos/default.png')
  end
end

リサイズ部分を消して

# app>models>company.rb
def logo_url
  image_url('/images/companies/logos/default.png')
end

のようにしてテストをすると、エラーが出なくなりました。
なぜafter_teardownでテストデータを削除するとlogo_url関係のエラーが激しくなるのかは分かりませんが、おそらくlogo_urlのリサイズ部分が悪さしているのはほぼ間違いないかと思います。

それと、railsガイドにあったこちらのコードも組み込んでみましたが、

parallelize_setup do |i|
  ActiveStorage::Blob.service.root = "#{ActiveStorage::Blob.service.root}-#{i}"
end

ローカルのテストの時点で次のエラーが出るようになってしまいました。

Error:
Admin::CompaniesTest#test_update_company:
NoMethodError: undefined method `root=' for #<ActiveStorage::Service::DiskService:0x0000000107af9d50

パラレルライズというのがよくわからず使っているので、何か違うことをしてるかもしれません🙇‍♂️

今回after_teardownを試してみて、エラーは解消しなかったものの、やはりlogo_urllogo.variant(resize: LOGO_SIZE).processed.urlで行っているリサイズが怪しいという結論になりました。
ただ、このリサイズ部分はActiveStorageの機能で実装されていて、これをCIが通りやすく改善するのは難しい気がしています。

CIを通りやすくするためには、今回のPRでのcompanyのロゴのアタッチは見送りユーザー画像のみにするということも考えましたが、tksmasakiさんのご意見をお伺いしたいです🙏

@tksmasaki
Copy link
Contributor

@tomonariha
調査ありがとうございます!

CIを通りやすくするためには、今回のPRでのcompanyのロゴのアタッチは見送りユーザー画像のみにするということも考えましたが、tksmasakiさんのご意見をお伺いしたいです🙏

僕としてもありなのかなと思っています。
#4249 (comment) に書いたことですが、

私が以下のPRで作成したテスト以外では、用意されている画像データがアタッチされている必要があるテストがなかったため、テスト実行時に画像を含む全てのデータが揃っている必要がないと判断する場合もあるかなと思いました。

という状況だと思うので、Issueを立ておいていうのもなんですが、companyのテスト環境のアタッチができてなくてもとりあえずは大丈夫だと思います...(作業してもらっておいて、なくてもいいかも、みたいな感じになったら申し訳ないです🙇)

エラーの原因ははっきり分かったほうがいいとは思いますが、優先度は高くないのかな?と思うので、そのあたりを含めkomagataさんと相談していただけるとありがたいです!

@tomonariha
Copy link
Contributor Author

@tksmasaki さん、貴重なご意見ありがとうございます🙏大変参考になります。
私としてもなんとかエラー原因を突き止めて解消したい所なのですが、落ちやすいのがCIのマシンスペックに起因するような場合は私の手に余る可能性があるのと、あまりに時間をかけて調査をしているとrails7移行のPRがマージされて今回のPRの意味が薄くなってしまうという事情もありますので、もう少し粘って調査したら、tksmasakiさんにいただいたご意見も踏まえてkomagataさんの方に相談してみようと思います。

@tomonariha tomonariha force-pushed the bug/link-userdata-and-images-in-test-environment branch 2 times, most recently from 3751749 to 0c72180 Compare July 14, 2022 05:52
@tomonariha tomonariha force-pushed the bug/link-userdata-and-images-in-test-environment branch from 4be293b to ab75434 Compare July 14, 2022 12:10
@tomonariha
Copy link
Contributor Author

@tksmasaki さん、お疲れ様です!
先日チーム開発のミーティングで今回のissueのCIの件を相談したところ、エラーを検知して処理するようにしたらどうかというご意見をいただきました。
そこで例のlogo_urlに例外処理を追加することで、CIを通りやすくすることができました。
既にapproveいただいていますし、大した処理ではないのでご確認いただく必要はないかと思いますが、一応ご報告させていただきます🙇‍♂️

それと、今回レビューをお引き受けいただいて、多大な時間と労力を割いて下さりありがとうございました!
丁寧に見ていただき、tksmasakiさんにレビューをお願いしてよかったと思いました🙏
まだマージされたわけではないので、今回の件についてまたお聞きすることもあるかもしれませんが、その時はお力添えいただけると嬉しいです🙇‍♂️
重ね重ねになりますが、本当にありがとうございました!

@tksmasaki
Copy link
Contributor

@tomonariha

先日チーム開発のミーティングで今回のissueのCIの件を相談したところ、エラーを検知して処理するようにしたらどうかというご意見をいただきました。

なるほど、これなら問題が確実に改善してよさそうですね!
こちらこそ勉強になることが多いので、レビュー依頼ありがたいです🙏 今後も気軽にお声掛けください〜

@tomonariha
Copy link
Contributor Author

@komagata さん、レビューよろしくお願いします🙏

@tomonariha tomonariha requested a review from komagata July 15, 2022 14:41
Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確認させて頂きました。OKです〜🙆‍♂️

このIssueやっていただいて助かります〜!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants