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
RSpec導入奮戦記/The struggle of introducing RSpec
Search
muryoimpl
November 03, 2019
Technology
2
1.7k
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
Kanazawa.rb LT大会用/kzlt コマンドの説明 2024/01版
muryoimpl
0
2.2k
kzltコマンドの新たなソリューションについて
muryoimpl
0
2.2k
俺とTODOアプリ~Linearの変~
muryoimpl
0
1.8k
POSIX文字クラスでの躓き
muryoimpl
0
1.8k
/kzlt コマンドとは
muryoimpl
0
730
meetup.kzrb.org の更新を考える 事前激闘編
muryoimpl
0
1.2k
meetup.kzrb.org の更新を 考える ゆるふわ編
muryoimpl
0
1.2k
最近のデスク周りの diff / kzrb meetup#108-2
muryoimpl
0
19
ショートカットキーのショートカットキー / shortcut keys of shortcut keys
muryoimpl
0
85
Other Decks in Technology
See All in Technology
Kubeshark で Kubernetes の Traffic を眺めてみよう/Let's Look at k8s Traffic with Kubeshark
kota2and3kan
3
370
DevOps視点でAWS re:invent2024の新サービス・アプデを振り返ってみた
oshanqq
0
180
バクラクのドキュメント解析技術と実データにおける課題 / layerx-ccc-winter-2024
shimacos
2
1k
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
180
マイクロサービスにおける容易なトランザクション管理に向けて
scalar
0
110
KubeCon NA 2024 Recap / Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads
z63d
1
240
サービスでLLMを採用したばっかりに振り回され続けたこの一年のあれやこれや
segavvy
2
360
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
190
5分でわかるDuckDB
chanyou0311
10
3.2k
Wantedly での Datadog 活用事例
bgpat
1
400
Microsoft Azure全冠になってみた ~アレを使い倒した者が試験を制す!?~/Obtained all Microsoft Azure certifications Those who use "that" to the full will win the exam! ?
yuj1osm
1
110
【re:Invent 2024 アプデ】 Prompt Routing の紹介
champ
0
140
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
Making the Leap to Tech Lead
cromwellryan
133
9k
Embracing the Ebb and Flow
colly
84
4.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
The Invisible Side of Design
smashingmag
298
50k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
What's in a price? How to price your products and services
michaelherold
243
12k
The Language of Interfaces
destraynor
154
24k
Gamification - CAS2011
davidbonilla
80
5.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
4 Signs Your Business is Dying
shpigford
181
21k
Optimising Largest Contentful Paint
csswizardry
33
3k
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 が大きくなり、レビュアーの負担に なってきている => 適当な単位で区切ってはいるものの匙加減難しい
実感として • 最初はモブプロ形式でみんなで進めて、レビューされ慣れたあたりで各自担当を もってテスト追加していく、くらいがよさそう • メンバーのモチベーションが高いことに助けられている。 ただでさえ負債の回収フェーズでマイナスに気持ちになりがちなので、過度なプレッ シャーは取り除く • まだまだ始まったばかりなので、コツコツ進めてリファクタリングに到達するぞ!
私からのお願い 頼む!アプリケーション書くときに テストコードも書いてくれ!!! 頼む!