Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

RSpecしぐさ

5,714 views

Published on

2017-12-09 Rails Developers Meetup 2017

Published in: Technology
  • Be the first to comment

RSpecしぐさ

  1. 1. RSpecしぐさ ~歴史から学ぶRSpec~ 大仲 能史 a.k.a. @onk 2017-12-09 Rails Developers Meetup 2017
  2. 2. 自己紹介
  3. 3. 大仲 能史 a.k.a. @onk •株式会社ドリコム •Rails エンジニア歴 9 年ぐらい •v1.2.x から眺めてました • 本格的に使いだしたのは v2.3.x から • 2007-04 からRails勉強会@東京に参加 •RSpec も v1.x から使っています
  4. 4. 宣伝
  5. 5. Rails勉強会@東京 第93回 •時:2017-12-16(土) 13:00~ •於:永和システムマネジメント •東京Ruby忘年会の前座 •https://railsmeetingtokyo.doorkeeper.jp/eve nts/68181
  6. 6. よろしく お願いします
  7. 7. RSpecの 歴史
  8. 8. 振舞駆動開発 ビヘイビア Behaviour Driven Development
  9. 9. 付録C
  10. 10. Developer Testing •開発者が行う、開発促進のためのテスト •<-> Customer Testing •顧客が、受け入れのため •<-> QA testing •品質保証担当者が、品質保証のため
  11. 11. Developer Testing •開発者が行う、開発促進のためのテスト •プラクティスにTDDがある
  12. 12. TDDの効果 •テスト可能な設計 •コード利用者の視点 •インターフェイス中心の設計
  13. 13. DeveloperTestingは テストではなく 設計技法である
  14. 14. 「テスト」に引 きずられないよ う語彙を変える
  15. 15. 語彙を変える 変更前(test) assertion test testcase test class 変更後(behaviour) expectation example example group spec
  16. 16. 新しい語彙には 新しいツール
  17. 17. RSpec
  18. 18. 新しい語彙をさらに進める •Arrange Act Assert •準備・実行・検証 •Given When Then
  19. 19. Given When Then •Given •〇〇な(状況|状態)で •When •××をしたら •Then •△△(が起きる|になる)
  20. 20. 順不同で入れ子にできる Given:酔っぱらっているときに When:クルマを運転すると Given:お巡りさんが居たら Then: | |Φ|(|´|Д|`|)|Φ|| Given:お巡りさんが居なかったら Then: 事故る
  21. 21. RSpecでのGiven When Then describe "#運転する" do before { 酔っぱらっている } subject { 運転する } context "お巡りさんが居るとき" do before { お巡りさんが居る } it { should be タイーホ } end ...
  22. 22. BDDとRSpecの 蜜月を過ごす
  23. 23. 青天の霹靂 New Expectation Syntax 2012-06 RSpec v2.11
  24. 24. # 非推奨 foo.should == bar foo.should_not == bar # 推奨 expect(foo).to eq bar expect(foo).not_to eq bar
  25. 25. expect記法に切り替える? •should記法はshouldメソッドをモンキー パッチで追加するため、BaseObjectや delegateのテストを書けない •ワンライナーのshouldは汚染されていな いので問題ないが、expect記法と合わせ るため it { is_expected.to xxx } を用意した
  26. 26. この辺りから 音楽性の違い を感じている このときに Refinements があれば今も should だっただろう
  27. 27. といった背景を 踏まえた RSpecしぐさ
  28. 28. 構造化する •describe/subject でテスト対象を示して •contextで場合分けをして •it/specify で spec を書く
  29. 29. 構造化する •describe/subject でテスト対象を示して •contextで場合分けをして •it/specify で spec を書く •ワンライナーが使える場合は it •expect().to を書く場合は specify と使い分ける その方が英語として自然だからだよ!
  30. 30. 極力subject/shouldを使う • subject/shouldを使うと「何を実行したのか」 「何をテストしているのか」を非常に読み取り やすいし --format documentation も読みやすくなる • 逆の方針が power_assert とか「雑」とか • メソッドチェーンを誘発して、書きやすいけど読み づらくなる感覚がある(慣れかも it { is_asserted_by { book.comments.first.author.name == "onk" } }
  31. 31. 事前条件はbeforeで整える •letだとGivenが分かりづらい(遅延評価)の で事前条件にはbeforeを推奨する •つまりインスタンス変数を積極的に使う •ここは一般的な規約の逆 •typoを検出できるbeforeが欲しい • let! に given の alias?
  32. 32. 事前条件はbeforeで整える subject { @user.male? } before { @user = create(:user, gender: gender) } context "when male" do let(:gender) { User::Gender::MALE } it { should eq true } end context "when female" do let(:gender) { User::Gender::FEMALE } it { should eq false } end context間の違いを表現す るときにのみ let を使い、 事前条件を整えるのは before で行う
  33. 33. まとめ
  34. 34. まとめ •BDDとは、TDDを「テスト」を使わないよ うに Dan North が発明した「言い換え」 •Given/When/ThenというBDDの語彙があり、 これを意識するとletを上手に使える •RSpecには今でも使えるshould記法があり、 これがテストを読みやすく構造化する
  35. 35. 参考URL • Rubyist Magazine 0021 号 (2007-09) - スはスペックのス 【第 1 回】 RSpec の 概要と、RSpec on Rails (モデル編) • http://magazine.rubyist.net/?0021-Rspec • RSpec の入門とその一歩先へ - t-wadaの日記 • http://d.hatena.ne.jp/t-wada/20100228/p1 • Rubyist Magazine 0035 号 (2011-09) - 改めて学ぶ RSpec • http://magazine.rubyist.net/?0035-RSpecInPractice • RSpecによるユニットテストの書き方 — recompile.net • https://recompile.net/posts/how-to-write-unit-test-with-rspec.html • Introduction · rspec-style-guide • https://willnet.gitbooks.io/rspec-style-guide/content/
  36. 36. 参考URL • Better Specs { rspec guidelines with ruby } • http://www.betterspecs.org/jp/ • 俺のRSpecがこんなに雑なわけがない - Qiita • https://qiita.com/kbaba1001/items/5333d325d0a76dd29581 • Everyday Rails Testing with… by Aaron Sumner [PDF/iPad/Kindle] • https://leanpub.com/everydayrailsrspec • クは駆動のク オブジェクト倶楽部 2006クリスマスイベント (2016-12-20) • http://objectclub.jp/download/files/event/2006Christmas/d_is_for_driven.pdf • Arrange Act Assert • http://wiki.c2.com/?ArrangeActAssert
  37. 37. 参考URL • GivenWhenThen • https://martinfowler.com/bliki/GivenWhenThen.html • Given-When-Then - 日々ごちゃごちゃと考える • http://d.hatena.ne.jp/bowbow99/20090523/1243043153 • RSpec's New Expectation Syntax • http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ • 「RSpec は英語として読みやすいから良い」というお題目はなんだったの か - @kyanny's blog • http://blog.kyanny.me/entry/2012/07/12/234344 • "rspec の書き方がわからない" - Togetter • https://togetter.com/li/656392

×