Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RSpec導入奮戦記/The struggle of introducing RSpec
Search
muryoimpl
November 03, 2019
Technology
2
1.9k
RSpec導入奮戦記/The struggle of introducing RSpec
2019/11/03 (日) に開催された 富山 Ruby 会議 01 の LT で使用した資料。
muryoimpl
November 03, 2019
Tweet
Share
More Decks by muryoimpl
See All by muryoimpl
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
75
人魚とたわむれる
muryoimpl
0
26
Kanzawa.rbのLT大会を支える技術の裏側を変更する Ruby on Rails + Litestream 編
muryoimpl
0
1.3k
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
3k
kzltコマンドの新たなソリューションについて
muryoimpl
0
2.9k
俺とTODOアプリ~Linearの変~
muryoimpl
0
2.6k
POSIX文字クラスでの躓き
muryoimpl
0
2.3k
/kzlt コマンドとは
muryoimpl
0
960
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.6k
Other Decks in Technology
See All in Technology
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
510
re:Invent 2025 ~何をする者であり、どこへいくのか~
tetutetu214
0
120
Noを伝える技術2025: 爆速合意形成のためのNICOフレームワーク速習 #pmconf2025
aki_iinuma
2
2.1k
A Compass of Thought: Guiding the Future of Test Automation ( #jassttokai25 , #jassttokai )
teyamagu
PRO
1
250
AI時代におけるアジャイル開発について
polyscape_inc
0
130
Sansanが実践する Platform EngineeringとSREの協創
sansantech
PRO
2
670
AWS Bedrock AgentCoreで作る 1on1支援AIエージェント 〜Memory × Evaluationsによる実践開発〜
yusukeshimizu
6
370
小さな判断で育つ、大きな意思決定力 / 20251204 Takahiro Kinjo
shift_evolve
PRO
1
580
EM歴1年10ヶ月のぼくがぶち当たった苦悩とこれからへ向けて
maaaato
0
270
ブロックテーマとこれからの WordPress サイト制作 / Toyama WordPress Meetup Vol.81
torounit
0
510
RAG/Agent開発のアップデートまとめ
taka0709
0
140
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
2
140
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
4 Signs Your Business is Dying
shpigford
186
22k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Building an army of robots
kneath
306
46k
Making Projects Easy
brettharned
120
6.5k
The Invisible Side of Design
smashingmag
302
51k
Scaling GitHub
holman
464
140k
Why Our Code Smells
bkeepers
PRO
340
57k
Building Applications with DynamoDB
mza
96
6.8k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Transcript
RSpec 導入奮戦記 2019/11/03 富山 Ruby 会議 01 #toyamark muryoimpl
とあるプロジェクトのお話 既存のRailsアプリケーションに対し、前任者が用意したRSpec coverage 5% の状態から、RSpec をほぼ実装したことのないメン バー4人とともに、学習しつつ、model, decorator, uploader, service
のテスト, request spec, system spec を作成してリファク タリングするところまでやるぞ!という、Railsアプリの運用を楽しく しよう!とチャレンジをしている最中の物語。
ねらい • テストを作成する文化を根付かせたい • 本体コードが になっているので、リファクタリングして意図 のわかるコードにしたい • 上記2つを通して、メンバーのスキルアップを図りたい
編成 • メンバー 4 人 ◦ RSpec ほぼ実戦では書いたことがない ◦ 伸びしろ
100% • 私 ◦ コーチ ◦ テストコードのレビュー ◦ 難易度高いところをひたすらテスト書く係
現時点での計画 • 機能のエンハンスは期間限定で停止 。 ただ し、調査・修正は実施する。 ◦ なるべくテスト作成に力を注ぐため • 本体をリファクタリングしたい欲をぐっと堪え てテスト作成に専念する
。 ◦ 実行単位の難易度を下げる ◦ いろんなところに波及しがちなのでテスト揃え てからやる • 難易度を考え、model のテストから順に作成 していくこととする。 ◦ テストのフィードバックが一番速いはず ◦ 容易なメソッドが多かったため ① ② ③ 当作戦は3期計画を予定している。 ① model/decorator/uploader テスト作成期 ② request spec, system spec作成期 ③ リファクタリング期 ※現在 ① 期後半戦 (作戦開始後ほぼ1ヶ月)
実践編 その1 • 当作成実行前に、モブプロ形式でテーブルに対応した ActiveRecord のモデルを 使ってブートキャンプを行う ◦ データ作成で FactoryBot
を使う、それを it/specify 内で使うために let を使う ◦ User#full_name で “#{last_name}#{first_name}” に対して eq matcher を使う ◦ .find で ActiveRecord::RecordNotFound が発生することを expect { … }.to で確認する ◦ .find_by で be_nil を使う, allow を使って .find_by! 相当の挙動を and_raise で実現する ◦ #save で change matcher, valid? 呼び出しに対し have_received matcher を使う ◦ allow/expect は設定するobjectが検証対象のobjectと同一かどうか注意する • 実戦前に rubocop-rspec を導入しておく ◦ 既存のテストについては警告が大量に出るので除外し、テスト追加時に併せて対応する ◦ コーチが指摘する量を減らし、その時間をより本質的な指摘に使うため ◦ 警告食らってドキュメント見て Copの意図を理解してもらう狙いも
実践編 その2 • モブプロ形式でモデルのテストを追加していき、その場でマージしていく ◦ 2時間/日 を確保してもらって、ドライバを替えながら 対象 VS 私たち
でテストに立ち向かう ◦ 別件調査等でテスト作成の作業時間が確保できないメンバーもテスト作成、レビューができるように 会として設定している => 特にレビューが滞りがち ◦ PR レビュー形式だとコーチがピンポイントで better な案を指摘しがち => テスト作成者たちが考え、議論することを重視 し、指摘はクイズ形式、解答は意図を添えて ◦ モブプロ以外にも時間が確保できるメンバーは PR作成、質問をバンバンしてもらう ◦ 出ているPRもこの時間でみんなでレビューして指摘、マージする ◦ 実は他のコードをコピペしてきて解決しようとするのを抑止している • コーチはひたすら事例を作成するようにテストを量産してレビューにまわす ◦ 書き方のパターンを提供する ◦ 新たなパターンが出てきた場合は、モブプロ時に紹介する ◦ …ちょっと機会を奪っている気もする …
伝承編 これらのリンクを紹介し、一部説明を加えた • RSpec によるユニットテストの書き方 - recompile.net ◦ https://recompile.net/posts/how-to-write-unit-test-with-rspec.html •
RSpecのletを使うのはどんなときか?(翻訳) ◦ https://qiita.com/jnchito/items/cdd9eef2ed193267c651 • GETTING_STARTED.md - thoughtbot/factory_bot ◦ https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md • スペックのス ◦ https://magazine.rubyist.net/articles/0021/0021-Rspec.html ◦ https://magazine.rubyist.net/articles/0023/0023-Rspec.html • 改めて学ぶ RSpec ◦ https://magazine.rubyist.net/articles/0035/0035-RSpecInPractice.html • Everyday Rails - RSpec による Rails テスト入門 ◦ https://leanpub.com/everydayrailsrspec-jp
よく出た注意点 • 振る舞いをテストすること。振る舞いのテスト != メソッドのテスト ◦ carrierwave の store_dir のパス比較しても嬉しくない。動作させた上で
store_dir に保存されること を確認したい • use_transactional_fixtures, DatabaseCleaner, DatabaseRewinder 等の設定か ら example ごとにデータが削除 or ロールバックされているか確認する ◦ この設定が入っているにもかかわらず、着手当初は手前の exampleで作成したデータが残っている こと前提でテストを書きがち。テストの独立性の話で --order rand と一緒にお伝えしておくのがよさ そう。 • テスト作成をガイドするのもテスト ◦ テストをどう書くかを悩むときにテスト流さずに机上で悩みがち。簡単に手元でテストが流せるから、 バンバン流してフィードバックもらって作っていって欲しい (願)。
はたして現状はどうなっているか (1ヶ月経過時点) • メンバーはRSpec読み書きできるレベルには到達した ◦ rspec-mock である処理を握りつぶしたり …を書くのはもう少し先の話 ◦ 本体コード修正PRにもテストが付属してくるようになった
◦ PRレビュー時に他のメンバーからもテストについて指摘が出てくるようにもなった ◦ subject, let をうまく使った読みやすいテストコードが出てくるようになった • 思ったよりテスト作成の速度が出ていない ◦ 問い合わせによる調査、修正の時間が思っていたよりある。時間の確保が課題になった ◦ 時間確保のため、モブプロ時間の内容の見直しや、作業の仕方を模索中。スプリントごとに施策を 替え、試してよさそうなものを採用するようにしている • レビューに思ったより時間がかかる ◦ テストの追加がクラス単位なので、クラスのメソッドが多いと PR が大きくなり、レビュアーの負担に なってきている => 適当な単位で区切ってはいるものの匙加減難しい
実感として • 最初はモブプロ形式でみんなで進めて、レビューされ慣れたあたりで各自担当を もってテスト追加していく、くらいがよさそう • メンバーのモチベーションが高いことに助けられている。 ただでさえ負債の回収フェーズでマイナスに気持ちになりがちなので、過度なプレッ シャーは取り除く • まだまだ始まったばかりなので、コツコツ進めてリファクタリングに到達するぞ!
私からのお願い 頼む!アプリケーション書くときに テストコードも書いてくれ!!! 頼む!