Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf

みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf

hideki kinjyo

July 27, 2024
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. グループワーク用に テスト/TDDプロフィールカードを作ろう!! プログラミング経験(実務)年数 TDDレベル ★: 初級者 ・・未経験、これから ★★: 経験者・・やったことがある、たまに使う ★★★:

    ベテラン・・日常的に使う テスト(単体テスト、自動化テスト)レベル ★: 初級者 ・・未経験、これから ★★: 経験者・・やったことがある、たまに使う ★★★: ベテラン・・好きぃ〜〜 事前準備 卓上の情報カードとペンを 使って作成後、同じグルー プの人から見えるように置 いてください! 例 =>
  2. 自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h / 𝕏

    : @o0h_ • アイコンは美味しい鮭親子丼の写真です • 普段は東京のIoT会社でバックエンドやってます
  3. 自己紹介 • 普段はPHP系のコミュニティに出入りしています • 好きなFWはCakePHP • 今年は"毎月発生していた"PHP系カンファレンスに参加しました💪 • 北海道、大阪、東京、神奈川、香川、福岡 •

    機会があると登壇したりも • (直近だと)EM、モニタリング、テスト・設計、デバッガ、データ構造…なんて 
 その時々で浮かんだネタで発表しています
  4. やること(流れ) 1. 出だし ★今ココ 2. <おさらい> 教科書通りのTDDを駆け足で 3. <つなぎ> 書籍や発表資料から「TDDの効果」について共有

    4. <メイン> 「TDDで◯◯なりたい」について議論 (小グループで) 5. <クロージング> 話したことの共有
  5. テスト駆動開発とは? 「一般的」な開発 機能を開発して、 
 欠陥がないことを 
 テストを実施によって 
 確認する テストファースト

    最初にテストを書いて 
 必要な項目が列挙し、 
 合致するよう 
 機能を開発する テスト駆動開発 やりたい事を 
 小さいテストで表現し、 
 合致するよう機能の開発、 
 機能・テストが揃った状態 で双方のコードを整える、 
 を反復的に進める
  6. 例えばFizzBuzz • [ ] 1〜100の数字を受けとり、何かを出す • [ ] 簡単そうなのは「数字をそのまま出力する」なので、そこを扱う •

    [ ] 「3で割り切れる時はFizz」を扱う • [ ] 「5で割り切れる時はBuzz」を扱う • [ ] 「3でも5でも割り切れる時はFizzBuzz」を扱う
  7. 例えばFizzBuzz function fizzBuzz($i){ 
 return '͋͋͋'; 
 } $actual =

    fizzBuzz(true); 
 assert(any($actual)); 1〜100の数字を受けとり、何かを出す => 何かを受け取り何かを出す テストの声に従い 
 中身の実装
  8. 例えばFizzBuzz / 更新されたTodoList • [x] 1〜100の数字を受けとり、何かを出す • 呼び出し可能な関数「fizzBuzz()」を用意する • 値を受け取れるようにする

    • 何かを出すようにする • [ ] 簡単そうなのは「数字をそのまま出力する」なので、そこを扱う • [ ] 「3で割り切れる時はFizz」を扱う • [ ] 「5で割り切れる時はBuzz」を扱う • [ ] 「3でも5でも割り切れる時はFizzBuzz」を扱う
  9. 例えばFizzBuzz function fizzBuzz($i){ 
 return '͋͋͋'; 
 } fizzBuzz(1); 1〜100の数字を受けとり、そのまま出す

    => 数字を受け取る 数字を受け取っている様子を 
 テストで再現
  10. 例えばFizzBuzz function fizzBuzz($i){ 
 return '͋͋͋'; 
 } fizzBuzz(1); 1〜100の数字を受けとり、そのまま出す

    => 数字を受け取る 「失敗する」ことを 
 確認するまでは 
 次に進まないようにする
  11. 例えばFizzBuzz function fizzBuzz($i){ 
 return '͋͋͋'; 
 } fizzBuzz(1); expectError(

    
 TypeError, fizzBuzz('͋͋͋') 
 ); 1〜100の数字を受けとり、そのまま出す => 数字"のみ”を受け取る 「数字」と「それ以外」の 
 三角測量
  12. 例えばFizzBuzz function fizzBuzz(int $i) { 
 return '͋͋͋'; 
 }

    fizzBuzz(1); expectError( 
 TypeError, fizzBuzz('͋͋͋') 
 ); 1〜100の数字を受けとり、そのまま出す => 数字"のみ”を受け取る 引数の型を制限することで実現
  13. 例えばFizzBuzz function fizzBuzz($i){ 
 return '͋͋͋'; 
 } 1〜100の数字を受けとり、そのまま出す =>

    受け取った数字をそのまま出す もう少し問題を分解(単純に)できる
  14. 例えばFizzBuzz function fizzBuzz($i){ 
 return 1; 
 } 1〜100の数字を受けとり、そのまま出す =>

    入力が7の時に7を返す assert(1 == fizzBuzz(1)); assert(7 == fizzBuzz(7));
  15. 例えばFizzBuzz function fizzBuzz($i){ if ($i == 7) { return 7;

    } 
 return 1; 
 } 1〜100の数字を受けとり、そのまま出す => 入力が7の時に7を返す assert(1 == fizzBuzz(1)); assert(7 == fizzBuzz(7));
  16. 例えばFizzBuzz function fizzBuzz($i){ if ($i == 2) { return 2;

    } 
 if ($i == 7) { 
 // লུ 1〜100の数字を受けとり、そのまま出す => 入力が2の時に2を返す assert(1 == fizzBuzz(1)); assert(7 == fizzBuzz(7)); assert(2 == fizzBuzz(2));
  17. 例えばFizzBuzz // লུ 
 if ($i == 7) { 


    return 7; 
 } -- return 1; ++ return $i; 
 } 1〜100の数字を受けとり、そのまま出す => 受け取った数字をそのまま出す assert(1 == fizzBuzz(1)); assert(7 == fizzBuzz(7)); assert(3 == fizzBuzz(3)); assert(2 == fizzBuzz(2)); assert(4 == fizzBuzz(4)); assert(5 == fizzBuzz(5));
  18. 例えばFizzBuzz function fizzBuzz($i){ return $i; } 1〜100の数字を受けとり、そのまま出す => 受け取った数字をそのまま出す assert(1

    == fizzBuzz(1)); assert(7 == fizzBuzz(7)); assert(3 == fizzBuzz(3)); assert(2 == fizzBuzz(2)); assert(4 == fizzBuzz(4)); assert(5 == fizzBuzz(5)); コードが散らかってきたのが 
 気になったタイミングでリファクタ
  19. 例えばFizzBuzz / 更新されたTodoList • [x] 1〜100の数字を受けとり、何かを出す • 呼び出し可能な関数「fizzBuzz()」を用意する • 値を受け取れるようにする

    • 何かを出すようにする • [x] 簡単そうなのは「数字をそのまま出力する」なので、そこを扱う • 入力が1の時に1を返す • 入力が7の時に7を返す • 入力が2の時に2を返す • 受け取った数字をそのまま出す • [ ] 「3で割り切れる時はFizz」を扱う • [ ] 「5で割り切れる時はBuzz」を扱う • [ ] 「3でも5でも割り切れる時はFizzBuzz」を扱う
  20. 色々な人が言っていること TODOリストの整理を通じて実行すべきテストを考える #tddbc / TDDBC 2020 Online LT - Speaker

    Deck 
 https://speakerdeck.com/nihonbuson/tddbc-2020-online-lt 最初に考えた事でも可変、常に調整し続ける
  21. TDDは工学的にどう「良い」と言えそうか? 個々の論文が、TDDの効果をどう評価しているか、以下の10項目に分類していま す。 欠陥の密度や量 (amount and density of defects) コードカバレッジ

    (code coverage) コードの複雑度 (code complexity) 結合度 (coupling) 凝集度 (cohesion) サイズ (size) 工数 (effort) 外部品質 (external quality) 生産性 (productivity) メンテナンス性 (maintainability) 19の研究を調査した結果、欠陥の減少とメンテナンス性の向上がTDDの効果として 期待できると言えます。TDDでは全体コードサイズが増えますが、コードカバレッ ジはよくなります。 色々な人が言っていること TDDの効果の研究をまとめた研究 - やっとむでぽん 
 https://yattom.hatenablog.com/entry/20131103/p1
  22. 議論する時のコツ① • バックボーンや知識の異なる人同士の意見交換を楽しんでください! • 誰に対しても 
 「話は遮らないで聞く」「ずっと喋りすぎない」を意識しましょう • 話すのが苦手な人、初対面で疲れてる人も 


    マイペースで参加すればOK〜っていう雰囲気、作っていきましょう! • 余裕がある人は、リアクションを大きめにしてくれると温まります! • 相槌、笑い(声・笑顔)、共感のワカル-ナルホド-の声
  23. 議論する時のコツ② 「正解を知る」ではなく「咀嚼する」がこの場でやりたいことです! 
 => 色々な立場からできる貢献があります • 未経験者、初級者 • 「素朴な疑問」を投げかける役割を担ってください 


    「ココまではわかった」「ココがピンときてない」など • 場に対して「丁寧な言語化にチャレンジする」のに繋がります • 経験者 • 自身の経験したこと・知っていることを積極的に共有する役割を担ってください • ベテラン • 「パターン化」「抽象化、本質に迫る視点を提供する」役割を担ってください
  24. 進め方の例・目安 • 最初のn分で「TDDについての疑問」「期待」を 
 ざっくばらんに話してみる • どう始めるの?いつ使う?使ってみようと思ったきっかけは? • TDDってこういうことも上手く出来るようになる? •

    プログラミングやっていてこういう所が難しい〜 • おおよその「◯◯なりたい」を絞って、議論の方向性を確認する • 最後のn分で「まとめ」に入る
  25. 発表例 〜xx:xxマデ • TDDで◯◯なりたい ← ◯◯に何を入れたのか教えて下さい • 次のようなポイントを教えて下さい(例) • どうしてその◯◯を選んだのか、何を期待しているのか。何が解決されるか

    • そのために実践したいことは?(コツ、心がけたいこと) • 話したけど解消されていないこと、詳しい人に聞いてみたいこと • 厚めな紙・ペンを用意しているので、まとめてみてください • あとでブログにしたいので物証を残そう!!!!!!!!!
  26. 楽しんでもらえれば幸い中の大幸いです! • TDD、とても奥深くて魅力的な技法・思考法です。 
 やっていきたい!!!!!!!! • こういう場で「ざっくばらんに誰とでも喋ってみる」のは、 
 技術コミュニティが楽しくなる1つの魅力かな〜と思います •

    「すごい・有名な人」が野生の存在として歩いてるのも面白いところ。 
 でも話しかけるのが怖い・・なんて声かければ・・ 
 => 今ここで出た「コレどうしてるんだろう?」をぶつけるチャンス!