Slide 1

Slide 1 text

テストコード未経験者が RailsでそれなりにRspecが かけるようになるまでの話 銀座Rails #6

Slide 2

Slide 2 text

2 https://twitter.com/yoshi_hirano/status/1092275495771750400

Slide 3

Slide 3 text

3 初学者向けのテストコードの書き方や テストコードをチームで取り組む みたいな話は見るが テストコードを書いてこなかった人が テストコードを書くようになった話 みたいのが ありそうであんまりない

Slide 4

Slide 4 text

4 それなりにシステム開発してるけど テストコードを書いたこと無いひとが… ● 書くようになるまでには ● 書き出した人が進む階段 ● 書き初めてつまずく場所 みたいなものを 自分の体験談をベースに 話していければと思っています

Slide 5

Slide 5 text

しんくう 最近はRailsエンジニアとか 開発の交通整理とか 2009年から3社ぐらい ソフトウェア開発を 続けてきてました。 守備範囲は浅く広く。 Twitter : @shinkufencer 5 自己紹介

Slide 6

Slide 6 text

6 自己紹介 Webアプリケーション開発者から見た、 MVCとMVP、そしてMVVMの違い - Qiita https://qiita.com/shinkuFencer/items/f2651073fb71416b6cd7

Slide 7

Slide 7 text

7 今日のもくじ 1. これまでの私と直前のステータス 2. Rspecと向き合うきっかけ、下準備 3. Rspecを使うなかでぶつかった小さな壁 4. そして今

Slide 8

Slide 8 text

8 これまでの私と直前のステータス

Slide 9

Slide 9 text

9 プログラマとしてやってきたもの ● Ruby on Rails (2.0) ● Flash Lite 1.1 ● ActionScript 3.0 ● C#(Unity) ● Java (Android) ● PHP (7.x)

Slide 10

Slide 10 text

10 プログラマとしてやってきたもの ● Ruby on Rails (2.0) ● Flash Lite ● ActionScript 3.0 ● C#(Unity) ● Java (Android) ● PHP (7.x) これだけやっているのに テストコードを書く機会に 触れていない

Slide 11

Slide 11 text

11 プログラマとしてやってきたもの ● Ruby on Rails (2.0) ● Flash Lite 1.1 ● ActionScript 3.0 ● C#(Unity) ● Java (Android) ● PHP (7.x) 元々テストコードを書く 文化がなく テストコード?って何? というような環境だった 基本は人力のQAで デバッグしており そこで品質担保を 行っていた

Slide 12

Slide 12 text

12 プログラマとしてやってきたもの ● Ruby on Rails (2.0) ● Flash Lite 1.1 ● ActionScript 3.0 ● C#(Unity) ● Java (Android) ● PHP (7.x) Flash Liteでは記述が 軽量化を重視するので テスト向けの実装が しにくい ActionScript 3.0も テストコードを書かない 文化圏でやっていたので 書くという発想がない

Slide 13

Slide 13 text

13 プログラマとしてやってきたもの ● Ruby on Rails (2.0) ● Flash Lite 1.1 ● ActionScript 3.0 ● C#(Unity) ● Java (Android) ● PHP (7.x) ゲーム開発において テストコードを書く 事例があまりなく 書いてこない文化も 相まって書かなかった ※ゲームでも書くところ はちゃんとかいてます

Slide 14

Slide 14 text

14 プログラマとしてやってきたもの ● Ruby on Rails (2.0) ● Flash Lite 1.1 ● ActionScript 3.0 ● C#(Unity) ● Java (Android) ● PHP (7.x) 1人プロジェクトだった ので各種テストフレーム ワークを使おうと思った のですが挫折 納期もタイトだったので ひたすら人力でテストし て難を逃れる

Slide 15

Slide 15 text

15 プログラマとしてやってきたもの ● Ruby on Rails (2.0) ● Flash Lite 1.1 ● ActionScript 3.0 ● C#(Unity) ● Java (Android) ● PHP (7.x) チーム的にテストコード に対しての意識が薄く 書かないほうが開発の スタンダードだった 自分も書いてはいない 出自だったので書かずに 過ごしてきた

Slide 16

Slide 16 text

16 いままでのテストコードの感覚 ● はじめての会社はテストコードというもの を扱う文化がなかった ● テスターメンバーが充実 + 優秀だったので 人力テストでバグは潰せたし 自身も念入りに手でデバッグしていた。 ● 「テストは大事である」 という意識が芽生えたあとでも やるだけの工数捻出ができない 定石がわからないので、踏み切れなかった

Slide 17

Slide 17 text

17 そしていろいろなものを経て ● Ruby on Rails (2.0) ● Flash Lite 1.1 ● ActionScript 3.0 ● C#(Unity) ● Java (Android) ● PHP (7.x) ● Ruby on Rails (5.x) イマココ!

Slide 18

Slide 18 text

18 Rspecと 向き合うきっかけ、下準備

Slide 19

Slide 19 text

某日 19

Slide 20

Slide 20 text

20 APIの案件があるので よろしくおねがいします。 企画の人

Slide 21

Slide 21 text

21 APIの案件があるので よろしくおねがいします。 はい、Railsでやります 企画の人 わたし

Slide 22

Slide 22 text

22 APIの案件があるので よろしくおねがいします。 はい、Railsでやります 企画の人 わたし 企画の人 ちょっとさまざまな理由で しばらくは開発1人体制で お願いします。

Slide 23

Slide 23 text

23 APIの案件があるので よろしくおねがいします。 はい、Railsでやります 企画の人 わたし 企画の人 ちょっとさまざまな理由で しばらくは開発1人体制で お願いします。 あ、外部のAPIと接続予定 もあるので忘れずに!

Slide 24

Slide 24 text

24 特殊なプロジェクトにアサイン ● APIサーバの開発だけれど様々な要因で しばらくは1人で開発。 ● 他のAPIなどとも接続するが、接続可能に なるのは開発期間の後半。 ● 利用側の事由で仕様が変わる可能性がかな りあった。 ● 企画側が練り上がるまで時間かかるので ほかの案件と並走。

Slide 25

Slide 25 text

25 わたし APIだから開発ボリュームは少 ないけど先方のAPI接続とかは 人力テストがしにくい

Slide 26

Slide 26 text

26 わたし APIだから開発ボリュームは少 ないけど先方のAPI接続とかは 人力テストがしにくい 急に仕様が変わったりするか もしれないから変更がおおい かもしれない

Slide 27

Slide 27 text

27 わたし APIだから開発ボリュームは少 ないけど先方のAPI接続とかは 人力テストがしにくい でも後から入ったメンバーに 混乱がないようにしなければ つらくなる 急に仕様が変わったりするか もしれないから変更がおおい かもしれない

Slide 28

Slide 28 text

28 わたし APIだから開発ボリュームは少 ないけど先方のAPI接続とかは 人力テストがしにくい でも後から入ったメンバーに 混乱がないようにしなければ つらくなる そのためにちゃんとするには どうすれば… 急に仕様が変わったりするか もしれないから変更がおおい かもしれない

Slide 29

Slide 29 text

29 とある資料を思い出す ふつうのRailsアプリケーション開発 https://www.slideshare.net/takafumionaka/rails-77195340

Slide 30

Slide 30 text

30 とある資料を思い出す ふつうのRailsアプリケーション開発 https://www.slideshare.net/takafumionaka/rails-77195340

Slide 31

Slide 31 text

31 足回りを整える ● 既存プロジェクトも足回りが整っていない 案件が多かったのでこれを期に整理

Slide 32

Slide 32 text

32 足回りを整える ● いままではgithubのreadmeに書かれた 手順を実行する形式だったので bin/setup,bin/updateに可能な限り纏める ● 今後の新規プロジェクトはRspecのルール を統一できるようにrspec.ymlをgem化 ● 新規のModelとControllerには必ずRspec を書くようにする ● 他プロジェクトでCircleCIは使っていたの でRspecとrubocopが失敗したらCI失敗と みなす当たり前を敷く

Slide 33

Slide 33 text

33 わたし CIがちゃんと活用できる仕組 みは整った。

Slide 34

Slide 34 text

34 わたし CIがちゃんと活用できる仕組 みは整った。 ただRspecを書く足回りが整え られていないので整えなけれ ば!

Slide 35

Slide 35 text

35 自身のRspec知識の足回りを整える ● 既存のRspecを参考にするにはベースの知 識が足りない、基礎を抑えてたい。 ● 伊藤淳一さんシリーズを活用する。 使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」 - Qiita https://qiita.com/jnchito/items/42193d066bd61c740612

Slide 36

Slide 36 text

36 自身のRspec知識の足回りを整える ● Rails関連の知識はカバーできなかったので 同じく伊藤さんの翻訳書籍をさらっと読ん でカバー Everyday Rails - RspecによるRailsテスト入門 Aaron Sumner 著 et al. [Leanpub PDF/iPad/Kindle] https://leanpub.com/everydayrailsrspec-jp

Slide 37

Slide 37 text

37 わたし Rspecの書き方はわかったので あとは実際に書きながら 研鑽してくしかない!

Slide 38

Slide 38 text

38 わたし 今回はAPIだし 一番書くのはきっと Request specだろう Rspecの書き方はわかったので あとは実際に書きながら 研鑽してくしかない!

Slide 39

Slide 39 text

39 わたし 今回はAPIだし 一番書くのはきっと Request specだろう そういえば他のプロジェクト で書いていたから 参考にしよう! Rspecの書き方はわかったので あとは実際に書きながら 研鑽してくしかない!

Slide 40

Slide 40 text

40 最初にみた既存コード ※実際のコードに似せて作ってあり、実際とは異なります

Slide 41

Slide 41 text

41 最初にみた既存コード わたし createって、Rspecの構文? それともそういうメソッドが 実はRailsにある? ※実際のコードに似せて作ってあり、実際とは異なります

Slide 42

Slide 42 text

42 最初にみた既存コード わたし インスタンス変数にいれてる これはrequest specのお作法 なのかな…? ※実際のコードに似せて作ってあり、実際とは異なります

Slide 43

Slide 43 text

43 最初にみた既存コード わたし 知識の少なさから混乱 右往左往しはじめる

Slide 44

Slide 44 text

44 Rspecを使うなかで ぶつかった小さな壁

Slide 45

Slide 45 text

45 ここからは 「事前に知っておいたら〜!」 とか 「独学だと気づきにくい…」 のような話をしていきます

Slide 46

Slide 46 text

46 create(:モデル名) ● FactoryBotというものの存在を知らない のでActiveRecordの便利機能か何かと勘 違い、createだからググラビリティも低い ● 既存コードを書いたメンバーから FactoryBotということを教えられる ● 自分で書く時は以下のように書くようにし ている。

Slide 47

Slide 47 text

47 let!とbeforeインスタンス変数 ● 基本的に既存定義はlet!を使う事例ばかり で、インスタンス変数を使うメリットが見 当たらなかった ● 実際使わなくても問題ないということを知 り、基本は使わないように。

Slide 48

Slide 48 text

48 require 'rails_helper' ● お約束のrequireだと思っていたが、これ があったりなかったりするプロジェクトが ある。 ● ちゃんと調べたらRailsの.rspecのオプショ ンで指定できるということを知る ● spec_helperとrails_helperを使い分けて 活用することもこれを通して知る

Slide 49

Slide 49 text

49 時間を変更するやりかた ● TimeCopを使うみたいな話を聞いていたが Rails5.xでは ActiveSupport::Testing::TimeHelpers があるのでそれを使う ● あまりコード例がないのでうっかり TimeCop使うところだった

Slide 50

Slide 50 text

50 そして今

Slide 51

Slide 51 text

51 Rspecを取り組んでいった結果 ● 初めてガッツリ取り組んだのがAPIサーバ だったのでrequest specとmodelのspecは それなりに書けるようになる ● 「Rspecを書かないと怖い」という感覚が 芽生え、馴染んできた ● 実際にバグが発生したときも Rspecで再現、修正、確認というフローが できたので安心感があった。

Slide 52

Slide 52 text

52 残された課題 ● APIばかりだった反動としてfeature spec やsystem specに関してはまだ修練が足り ないので積極的に身に着けたい ● WebMockに関してはまだ深いところを理 解できて使えてないのでしっかりと使いこ なせるようにしていきたい。

Slide 53

Slide 53 text

53 まとめ

Slide 54

Slide 54 text

54 まとめ ● いきなりテストコード書く機会であったが まとめられた記事や電子書籍のおかげで基 礎固めはできた ● 既存コードは右往左往する可能性があるの で、参考にするときは慎重に。よくわから なかったら右往左往する前に書き手に聞 く。 ● プラグインや、定石でない使い方は わかりやすくするなどしてあげるとよいか も

Slide 55

Slide 55 text

ありがとうございました 55