Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「再現ケース」の必要性とその難しさ
Search
Yasuo Honda
July 04, 2020
Technology
660
2
Share
「再現ケース」の必要性とその難しさ
銀座Rails#23
Yasuo Honda
July 04, 2020
More Decks by Yasuo Honda
See All by Yasuo Honda
PostgreSQL 18のNOT ENFORCEDな制約とDEFERRABLEの関係
yahonda
1
260
私のRails開発環境
yahonda
0
220
Railsの話をしよう
yahonda
0
260
RailsのPostgreSQL 18対応
yahonda
0
3.2k
Contributing to Rails? Start with the Gems You Already Use
yahonda
2
230
PostgreSQL 18 cancel request key長の変更とRailsへの関連
yahonda
0
300
extensionとschema
yahonda
1
350
NOT VALIDな検査制約 / check constraint that is not valid
yahonda
1
280
今、始める、第一歩。 / Your first step
yahonda
3
1.5k
Other Decks in Technology
See All in Technology
ブラウザの投機的読み込みと投機ルールAPIを理解し、Webサービスのパフォーマンスを最適化する
shuta13
3
300
エンタープライズの厳格な制約を開発者に意識させない:クラウドネイティブ開発基盤設計/cloudnative-kaigi-golden-path
mhrtech
0
370
要件定義の精度を高めるための型と生成AIの活用 / Using Types and Generative AI to Improve the Accuracy of Requirements Definition
haru860
0
310
AI時代に越境し、 組織を変えるQAスキルの正体 / QA Skills for Transforming an Organization
mii3king
5
4.2k
AI飲み会幹事エージェントを作っただけなのに
ykimi
0
110
オライリーイベント登壇資料「鉄リサイクル・産廃業界におけるAI技術実応用のカタチ」
takarasawa_
0
360
[Oracle TechNight#99] 生成AI時代のAI/ML入門 ~ AIとオラクルデータベースの関係 (前半)
oracle4engineer
PRO
2
240
鹿野さんに聞く!CSSの最新トレンド Ver.2026
tonkotsuboy_com
6
2.7k
"うちにはまだ早い"は本当? ─ 小さく始めるPlatform Engineering入門
harukasakihara
4
430
ServiceによるKubernetes通信制御ーClusterIPを例に
miku01
1
160
変化の激しい時代をゴキゲンに生き抜くために 〜ストレスマネジメントのススメ〜
kakehashi
PRO
4
1.2k
Building Production-Ready Agents Microsoft Agent Framework
_mertmetin
0
160
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
140
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
440
Mind Mapping
helmedeiros
PRO
1
190
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
Exploring anti-patterns in Rails
aemeredith
3
350
Faster Mobile Websites
deanohume
310
31k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
290
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
350
Writing Fast Ruby
sferik
630
63k
Transcript
銀座Rails#23 July 4, 2020 Yasuo Honda @yahonda 「再現ケース」の必要性とそ の難しさ
• 依存するライブラリやプログラムの変更で、アプリケーションやフレーム ワークに問題が出たときに、どうレポートするか • Rubyの変更でRailsのCIが落ちたときの例を元にうまくいったこと、うまく いかなかったこと • 技術的な側面よりも、どのように考えるか、どのように行動するかをお話し します 話すこと
• 開発中のRubyの変更で、開発中のRailsのCIが落ちることがある ◦ https://buildkite.com/rails/rails/builds?branch=master • Ruby 2.8.0dev ◦ 1日1回更新される rubylang/ruby:master-nightly-bionic
◦ 詳細は How to git bisect ruby/ruby repository 参照 RailsのCI
• Rubyのどのcommitが現象を引き起こしたか特定する ◦ git bisect を利用 ◦ How to git
bisect ruby/ruby repository 参照のこと • 現象が再現する手順を確立する ◦ minitest_bisect を利用する ◦ https://gist.github.com/yahonda/b67b19304d34fc1150a9db 79ee325bcc 参照のこと ◦ この時点ではRubyにとって”ミニマムな”再現手順ではない ◦ "ミニマム"の意味はリポジトリにより異なる Rubyの変更でRailsのCIが落ちたらやること
• 考えられる選択は以下のいずれか • 現象が発生したRailsのissues ◦ Issues · rails/rails · GitHub
• 現象を引き起こした(と報告時点では考えている) Rubyのissues ◦ Ruby Issue Tracking System 再現できたらどこにレポートするか
• 現象が発生したレポジトリ ◦ 私はずっとこうしていた(Railsのissueとして報告していた) • いいところ ◦ 再現ケースはRailsのUnit testなので、Railsフレームワーク開発者 にとってなじみがある(ミニマムなテストケースといえる)
• よくないところ ◦ Rubyの非互換性の可能性があっても、Rails側で「直してしまう」場合 がある 再現できたらどこにレポートするか(2)
• 現象のきっかけとなったレポジトリ ◦ いまはこうしています(bugs.ruby-lang.orgにまずレポート) • いいところ ◦ Ruby開発者にRubyの非互換性や問題を直接レポートできる ◦ 非互換性や問題はRuby開発者が意図している場合と意図していな
い場合があることがわかる ◦ Rubyが直る場合とRailsが修正される場合がある ▪ 意図しているRubyの非互換性であれば、現象が発生したレポジ トリ(Rails)で修正を行うことになる 再現できたらどこにレポートするか(3)
• よくないところ(難しいところ): ◦ ミニマムな再現ケースを作りにくい ◦ Ruby開発者にとってはRailsフレームワークのunit testはミニマム ではない ◦ Railsのunit
testをplainなRubyでの再現ケースにするのは大変 ▪ 私自身ほとんどできていない • Note: 100%の再現性を特定できていない場合 ◦ 現象が発生したレポジトリで、再現性を高めるための情報を得ましょ う 再現できたらどこにレポートするか(4)
実際の例2つ
• 最初はRailsにレポートした ◦ Action Text and Action View unit tests
are failing with ruby 2.8.0dev · Issue #38613 · rails/rails ▪ NoMethodError: undefined method `runnables' for ActiveJob::Base:Class • 2日後にRubyにレポートした ◦ https://bugs.ruby-lang.org/issues/16669 Case 1
• よかったこと ◦ Rubyが修正された ▪ https://github.com/ruby/ruby/commit/8119bcbf ▪ https://ruby-trunk-changes.hatenablog.com/entry/rub y_trunk_changes_20200423 に解説があります
• “defined? で undef したメソッドも "method" になってし まっていた” ◦ あたらしいRubyのビルドのきっかけになった ▪ 後で話します Case 1 (2)
• うまくいかなかったこと ◦ bin/testでは再現し、bundle exec rubyでは再現しない違いに気 づいていたが、Ruby(Without Rails)で再現ケースを作れなかった ▪ https://github.com/rails/rails/issues/38613#issuecom
ment-595285939 ◦ ミニマムな再現ケース(7行) ▪ https://twitter.com/kamipo/status/12528819301035581 44 Case 1 (3)
• うまくいかなかったこと ◦ minitest の--seedを固定しても、テスト実行順が固定化されなかっ た(再現したりしなかったりする原因) ◦ RailsのParallel testingがAction ViewとAction
Packで有効に なっているのに気づくのに時間がかかった ▪ Railsガイドを修正しました ▪ [skip ci] How to run Action View and Action Pack unit test in serial · Issue #38693 · rails/rails Case 1 (3)
• 最初からRubyにレポートした ◦ https://bugs.ruby-lang.org/issues/16973 ▪ ActiveSupportのto_jsonのテストが落ちる • Railsのbug templateを参考にしたRubyスクリプトにした ◦
Railsリポジトリをクローンしなくても再現できる ◦ https://github.com/rails/rails/blob/master/guides/bug_rep ort_templates/generic_master.rb ◦ gem "activesupport" - Plain Rubyスクリプトには遠い Case 2
• よかったこと ◦ 意図通りで、3rd party issueとしてクローズされた ▪ https://github.com/ruby/ruby/commit/41582d5866 ▪ https://ruby-trunk-changes.hatenablog.com/entry/rub
y_trunk_changes_20200619 に解説があります ◦ Ruby側の判断を受けて、Railsが修正されました ▪ https://github.com/rails/rails/pull/39697 Case 2 (2)
• よかったこと ◦ 再現ケースを小さくしたり、print debugの結果を更新していたら、 Railsの該当コードレビューワーからコメントがもらえた ◦ http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-cor e/98900 •
うまくいかなかったこと ◦ "Without Active Support"での再現ケースはつくれなかった ◦ それでも事象が解消されたことのほうが重要ではあります Case 2 (3)
最近追加されたRubyのビルド
• https://bugs.ruby-lang.org/issues/16895 が報告され、debug build(-DRUBY_DEBUG=1)つきRuby 2.8.0devが利用可能になった ◦ GitHub Actions: ruby-debug ◦
Docker Image: rubylang/ruby:master-debug-nightly-bionic • Railsでは下記のpull requestがopen ◦ https://github.com/rails/buildkite-config/pull/9 • Oracle enhanced adapterでは導入済み ◦ https://github.com/rsim/oracle-enhanced/pull/2015 最近追加されたRubyのビルド
Thank you