Slide 1

Slide 1 text

© - BASE, Inc. 「質」のいいユニットテストを 書くためのプラクティス . . #phperkaigi - @hgsgtk

Slide 2

Slide 2 text

© - BASE, Inc. このトークの全体図

Slide 3

Slide 3 text

© - BASE, Inc. このトークの⽬標 「初級者」から「中級者」へ

Slide 4

Slide 4 text

© - BASE, Inc. 想定する「初級者」 • ユニットテストフレームワークの⽂法がわかる • ⼀通りユニットテストを書いた • どういうテストが良いかわからない

Slide 5

Slide 5 text

© - BASE, Inc. ユニットテストについて話すこと 考え⽅と実践 - 「How Testing?」 ⽬的 - 「Why Testing?」 まとめ - 「That’s why Testing」

Slide 6

Slide 6 text

© - BASE, Inc. ⾃⼰紹介 東⼝和暉 (Kazuki Higashiguchi) Twitter / GitHub : @hgsgtk サーバーサイドエンジニア BASE BANK, Inc. / Dev Division

Slide 7

Slide 7 text

© - BASE, Inc. ユニットテストについて話すこと 考え⽅と実践 - 「How Testing?」 ⽬的 - 「Why Testing?」 まとめ - 「That’s why Testing」

Slide 8

Slide 8 text

© - BASE, Inc. 「費⽤対効果の⾼い」 このトークでの「質」 の定義

Slide 9

Slide 9 text

費⽤対効果?🤔

Slide 10

Slide 10 text

我々はなぜ ユニットテストを書くのか?

Slide 11

Slide 11 text

© - BASE, Inc. なぜユニットテストを書くのか • 品質向上、バグを防ぎたい? • テストによるドキュメンテーション? • 設計改善の指標?

Slide 12

Slide 12 text

© - BASE, Inc. 根本的な理由は コスト削減

Slide 13

Slide 13 text

© - BASE, Inc. コスト削減の指標 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS

Slide 14

Slide 14 text

© - BASE, Inc. ユニットテストによるコスト削減 ⼿動ユニットテストのコスト ドキュメンテーションコスト 設計改善によるメンテナンスコスト ⽋陥の早期発⾒による修正コスト デバッグコスト

Slide 15

Slide 15 text

© - BASE, Inc. ユニットテストの作成‧維持コスト 新規テスト作成コスト テスト実⾏時間の待ちコスト 既存テスト維持コスト ⾃動テストのためのCI維持コスト ユニットテストの学習コスト

Slide 16

Slide 16 text

© - BASE, Inc. コスト削減の指標 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 17

Slide 17 text

© - BASE, Inc. 「テストの経済性」 • 『xUnit Test Patterns』より 「テストの経済性」 • 最初は、⾃動化テストの学習‧ 実践コストによってコストが嵩 む • 徐々に落ち着いてきて、テスト による節約コストも増えてくる • 結果として、コストは相殺され ていく ref: https://qiita.com/hgsgtk/items/ 00daa278516d1995dac6

Slide 18

Slide 18 text

© - BASE, Inc. テストの⾮経済性 • 維持コストが⾼いテストがテス ト⾃⾝のコストが上げていく • 可読性が悪い • 修正頻度が多い • 修正が難しい • テストによる節約コストも少な い効果の薄いテスト • 結果的にトータルコストが増⼤ していく ref: https://qiita.com/hgsgtk/items/ 00daa278516d1995dac6

Slide 19

Slide 19 text

© - BASE, Inc. コスト削減の指標 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ >

Slide 20

Slide 20 text

© - BASE, Inc. まとめ:⽬的 - 「Why Testing?」 • 根本的な⽬的はコスト削減 • xUTPの「テストの経済性」 • 費⽤対効果の⾼いユニットテストを⽬指す

Slide 21

Slide 21 text

© - BASE, Inc. まとめ:⽬的 - 「Why Testing?」 「⽬的」

Slide 22

Slide 22 text

ここで⼀旦CM

Slide 23

Slide 23 text

© - BASE, Inc. BASEのプロダクトについて ネットショップ作成サービス 「BASE」 ショッピングアプリ 「BASE」 価値の交換をよりシンプルにし、 世界中の⼈々が最適な経済活動を⾏えるようにする。 MISSION

Slide 24

Slide 24 text

© - BASE, Inc.

Slide 25

Slide 25 text

はい

Slide 26

Slide 26 text

© - BASE, Inc. ユニットテストについて話すこと 考え⽅と実践 - 「How Testing?」 ⽬的 - 「Why Testing?」 まとめ - 「That’s why Testing」

Slide 27

Slide 27 text

© - BASE, Inc. 費⽤対効果の良いテストを書くために、 何を意識するべきか ユニットテストの「考え⽅」

Slide 28

Slide 28 text

© - BASE, Inc. ユニットテストの「考え⽅」 「考え⽅」

Slide 29

Slide 29 text

© - BASE, Inc. ユニットテストの「実践」 「実践」

Slide 30

Slide 30 text

意図を伝えるテスト

Slide 31

Slide 31 text

© - BASE, Inc. 意図を伝えるテスト

Slide 32

Slide 32 text

© - BASE, Inc. 意図を伝えるテスト • テストはメンテナンスされていく • 読み⼿にとって理解しやすくメンテナンスしやすいテ ストへ

Slide 33

Slide 33 text

© - BASE, Inc. 主に期待する効果 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 34

Slide 34 text

© - BASE, Inc. Test as Documentation 意図を伝えるテスト

Slide 35

Slide 35 text

© - BASE, Inc. このメソッドはどういう仕様? public function canUse(int $user_id): bool { $user = $this->User->findById($user_id); if (empty($user)) { return false; } if (!$user->isProhibit()) { return false; } if ($user->status === 7) { return false; } return true; }

Slide 36

Slide 36 text

© - BASE, Inc. ユニットテストがない場合 ΤϯδχΞ このメソッド何をし てくれるんだろう? • 動作コードを読んで理解する • もしあれば、ドキュメント(単体仕 様書など)を読む • 実際に動かして理解する • それでもわからない場合は、作成者 に聞きに⾏く

Slide 37

Slide 37 text

© - BASE, Inc. ユニットテストがない場合 ΤϯδχΞ このメソッド何をし てくれるんだろう? • 動作コードを読んで理解する • もしあれば、ドキュメント(単体仕 様書など)を読む • 実際に動かして理解する • それでもわからない場合は、作成者 に聞きに⾏く よくあるケース • 複雑なコードでひと⽬ではわからない • 意図通りなのかわからない

Slide 38

Slide 38 text

© - BASE, Inc. ユニットテストがない場合 ΤϯδχΞ このメソッド何をし てくれるんだろう? • 動作コードを読んで理解する • もしあれば、ドキュメント(単体仕 様書など)を読む • 実際に動かして理解する • それでもわからない場合は、作成者 に聞きに⾏く よくあるケース • そもそもない • メンテナンスされてなくて古い

Slide 39

Slide 39 text

© - BASE, Inc. ユニットテストがない場合 ΤϯδχΞ このメソッド何をし てくれるんだろう? • 動作コードを読んで理解する • もしあれば、ドキュメント(単体仕 様書など)を読む • 実際に動かして理解する • それでもわからない場合は、作成者 に聞きに⾏く よくあるケース • その対象だけを動かすのが難しい • 動かすための前準備に時間がかかる • 繰り返し実⾏するのが⼿間

Slide 40

Slide 40 text

© - BASE, Inc. ユニットテストがない場合 ΤϯδχΞ このメソッド何をし てくれるんだろう? • 動作コードを読んで理解する • もしあれば、ドキュメント(単体仕 様書など)を読む • 実際に動かして理解する • それでもわからない場合は、作成者 に聞きに⾏く よくあるケース • そもそも作成者が現場にいない • 作成者も覚えてない

Slide 41

Slide 41 text

© - BASE, Inc. ユニットテストがある場合 ΤϯδχΞ このメソッド何をし てくれるんだろう? • ユニットテストを読んで理解する • ユニットテストを実⾏して理解する • 動作コードを読んで理解する • 要件を知るためのドキュメントを読む • (それでもわからない場合)作成者に聞 きに⾏く

Slide 42

Slide 42 text

© - BASE, Inc. テストを読んで仕様を理解する assertSame($expected, $checker->canUser($user_id)); } /** * @return array */ public function dataProvider_canUse(): array { return [ ‘௨ৗϢʔβʔ͸ར༻Մೳͱ൑ఆ’ => [1, true], ‘Ϣʔβʔ͕ଘࡏ͠ͳ͍৔߹͸ར༻ෆՄͱ൑ఆ’ => [9999, false], ‘ېࢭϢʔβʔͷ৔߹͸ར༻ෆՄͱ൑ఆ’ => [2, false], ‘Ϣʔβʔ͕཭୤Ϣʔβʔͷ৔߹͸ར༻ෆՄͱ൑ఆ’ => [3, false], ]; }

Slide 43

Slide 43 text

© - BASE, Inc. テストを実⾏して理解する⽅法について

Slide 44

Slide 44 text

© - BASE, Inc. Simple Test Test as Documentation

Slide 45

Slide 45 text

© - BASE, Inc. このテストは何をしている? public function testConditional() { $Flight = new EagerFlight(); $Flight->setNumber(1); if ($Flight->number === 1) { $this->assertTrue($Flight->cancel()); } else if ($Flight->number === 2) { $this->assertTrue($Flight->cancel2()); } if ($Flight->airline_code === 'special') { $this->assertSame(2, $Flight->number); } }

Slide 46

Slide 46 text

© - BASE, Inc. Simple Test • テストは読み書きする上でシンプルであるべき • ⼩さいテスト • 1回につき”ひとつのこと”をテストする • 重点を置くべきは、「テストを書くこと」ではなく 「テストをすること」

Slide 47

Slide 47 text

© - BASE, Inc. Name to Convey Intent Test as Documentation

Slide 48

Slide 48 text

© - BASE, Inc. このテストはどういうパターン? assertSame($expected, $checker->canUser($user_id)); } /** * @return array */ public function dataProvider_canUse(): array { return [ [1, true], [9999, false], [2, false], [3, false], ]; }

Slide 49

Slide 49 text

© - BASE, Inc. Name to Convey Intent • 意図、期待値を伝えるための命名‧ラベリング • 読み⼿に伝わる “ドキュメント” を⽬指す

Slide 50

Slide 50 text

© - BASE, Inc. テストを改善する assertSame($expected, $checker->canUser($user_id)); } /** * @return array */ public function dataProvider_canUse(): array { return [ ‘௨ৗϢʔβʔ͸ར༻Մೳͱ൑ఆ’ => [1, true], ‘Ϣʔβʔ͕ଘࡏ͠ͳ͍৔߹͸ར༻ෆՄͱ൑ఆ’ => [9999, false], ‘ېࢭϢʔβʔͷ৔߹͸ར༻ෆՄͱ൑ఆ’ => [2, false], ‘Ϣʔβʔ͕཭୤Ϣʔβʔͷ৔߹͸ར༻ෆՄͱ൑ఆ’ => [3, false], ]; }

Slide 51

Slide 51 text

© - BASE, Inc. 振り返り:主に期待する効果 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 52

Slide 52 text

テストを独⽴させる

Slide 53

Slide 53 text

© - BASE, Inc. テストを独⽴させる

Slide 54

Slide 54 text

© - BASE, Inc. 主に期待する効果 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 55

Slide 55 text

© - BASE, Inc. SUTに対して疎結合 テストを独⽴させる

Slide 56

Slide 56 text

© - BASE, Inc. SUTに対して疎結合

Slide 57

Slide 57 text

SUT?🤔

Slide 58

Slide 58 text

© - BASE, Inc. SUT - Sytem Under Test • テストしている対象を⽰す • ユニットテストの場合、テスト対象のクラス‧メ ソッドなど • 書籍『xUnit Test Patterns: Refactoring Test Code』で登場する⽤語 https://www.amazon.co.jp/dp/ /ref=cm_sw_r_tw_dp_U_x_Y kJCb EX F

Slide 59

Slide 59 text

© - BASE, Inc. SUTとテストクラスの関係性

Slide 60

Slide 60 text

© - BASE, Inc. SUTとテストクラスの関係性 • CartTestクラスはCartクラスに依存している • クラス間の密結合はメンテナンスしていく上で弊害 になりうる • テストクラス‧SUT間もそれは同様

Slide 61

Slide 61 text

© - BASE, Inc. テストがSUTに密結合する弊害 • SUTの変更に敏感に反応してテストが落ちる • ex. Private methodの実装変更 • SUTの内部実装を変えるたびに、テストを修正する • 壊れやすいテスト • 維持コストを抑えるために疎結合を意識する

Slide 62

Slide 62 text

© - BASE, Inc. Test Public Method SUTに対して疎結合

Slide 63

Slide 63 text

© - BASE, Inc. Test Public Method • SUTをブラックボックスとして⾒る • ブラックボックスの外から⾒える Public Method に 対してテストするのが Better • 逆を返すと、Private Methodはテストしない⽅が Better • ブラックボックスの外から⾒えない

Slide 64

Slide 64 text

© - BASE, Inc. 尺度:Methodの “安定度” • Public Method • 外部から使⽤される想定を持つ • 変更の頻度が少ない、“安定”している • Private Method • 外部から使⽤される想定はない • 責務の “不安定” さ • 変更の頻度が⾼い、 “不安定”

Slide 65

Slide 65 text

© - BASE, Inc. Do Not Test Private Method • 変更の頻度が⾼い Private Method • → テストの修正の頻度も⾼くなる • →メンテナンスコストの増⼤ • Private Methodは、同⼀クラスのPublic Methodに よって使⽤される • → Public Testのテストでカバーできる

Slide 66

Slide 66 text

© - BASE, Inc. IF YOU CAN, Do Not Test Private Method • 現実の “レガシーコード” を⽬の前にするとテストし たいときはある • Private methodを切り出していくのが Better • それも苦しい時には、リファクタリングの障壁をへら すために、テストを書く選択肢もひとつある

Slide 67

Slide 67 text

© - BASE, Inc. Isolate SUT from others SUTに対して疎結合

Slide 68

Slide 68 text

© - BASE, Inc. 突然テストが落ちるようになりました、なぜ? public function test_canUse(int $user_id, bool $expected) { $search = CloudSearchWrapper::factory(); $search->conditions() ->keyword(‘test’, ‘title’) ->sort(‘list_order asc’); $search->documentBatch($this->addJson()); sleep(3); $result = $search->search($search->conditions()->query()); }

Slide 69

Slide 69 text

© - BASE, Inc. Isolate SUT from others • SUTを他のソフトウェア(外部システム)から隔離す る • 依存している場合 • 外部システムの動作変更‧状態に応じて、テストが 突然落ちる • Dependency Injectionなどの技法の活⽤ • 依存しているオブジェクトをTest Doubleに置き換 える

Slide 70

Slide 70 text

© - BASE, Inc. テスト間の独⽴ テストを独⽴させる

Slide 71

Slide 71 text

© - BASE, Inc. テスト間の独⽴

Slide 72

Slide 72 text

© - BASE, Inc. テスト間の独⽴性 • テストが相互依存‧順序依存する場合、 “独⽴性”が ない状態 • “独⽴性” がない弊害 • テストが通ったり落ちたりする • 「ローカルでは通るがCIでは通らないことがある」 • 不安定なテスト

Slide 73

Slide 73 text

© - BASE, Inc. 順序依存するテスト

Slide 74

Slide 74 text

© - BASE, Inc. 順序依存するテスト

Slide 75

Slide 75 text

© - BASE, Inc. Depend in Fixture properly テスト間の独⽴

Slide 76

Slide 76 text

© - BASE, Inc. Depend in Fixture properly • データベースを⽤いるテストを⾏う場合 Fixture を⽤ いる • 全テストケースで共有する 共有されたFixture • 共有しているためテストの追加‧変更に影響を受ける

Slide 77

Slide 77 text

© - BASE, Inc. 共有されたFixture Standard Fixture

Slide 78

Slide 78 text

© - BASE, Inc. 共有されたFixture Standard Fixture

Slide 79

Slide 79 text

© - BASE, Inc. 共有されたFixture TestE追加のためにFixtureを変更した Standard Fixture

Slide 80

Slide 80 text

© - BASE, Inc. “Standard Fixture” • “We reuse the design of the test fixture across the many tests. • 複数のテストケースでフィクスチャレコード定義 を共有する戦略 Refs ॻ੶ʰxUnit Test Patterns: Refactoring Test Codeʱ / Chapter 18. Test Strategy Patterns

Slide 81

Slide 81 text

© - BASE, Inc. 共有されたFixtureのMerit/Demerit • Merit • 共通のマスター系テーブルであれば、⼀回の Fixture作成で済む • Demerit • テスト間の独⽴性が損なわれる • エッジケースのテストのやりにくさ

Slide 82

Slide 82 text

© - BASE, Inc. テストケース専⽤Fixture • テストケースごとに⽤意するFixture (Minimal Fixture) • テスト間の独⽴性の向上 • ex. Laraval => Factory‧Faker

Slide 83

Slide 83 text

© - BASE, Inc. 共有 & 専⽤ Fixture • 2つの戦略を組み合わせて使う Standard Fixture

Slide 84

Slide 84 text

© - BASE, Inc. Fixtureに適切に依存する • 全テストで共有することが有益なケース • 基本となるFixtureを定義 • ex. 「通常のユーザー」 • 使いみちが限定されるエッジケースのテスト • テストケース専⽤Fixtureを⽤意する • ex. 「利⽤禁⽌になったユーザー」

Slide 85

Slide 85 text

© - BASE, Inc. Tear Down Global Changes テスト間の独⽴

Slide 86

Slide 86 text

© - BASE, Inc. Tear Down Global Changes • テストがグローバルな状態変化を⽣み出す場合 • $_SERVERの書き換え • Session状態の更新 • トランザクション • テスト時間 (timecop使⽤の場合など) • 他のテストに影響を及ぼす • テスト‧SUTの状態変化に応じてtearDownしておく

Slide 87

Slide 87 text

© - BASE, Inc. 振り返り:主に期待する効果 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 88

Slide 88 text

重複を最⼩限に

Slide 89

Slide 89 text

© - BASE, Inc. 重複を最⼩限に

Slide 90

Slide 90 text

© - BASE, Inc. 主に期待する効果 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 91

Slide 91 text

© - BASE, Inc. DRY in Test Code 重複を最⼩限に

Slide 92

Slide 92 text

© - BASE, Inc. DRY in Test Code • DRY (Don’t Repeat Yourself)は、テストコードにお いても同じく意識 • テストコードの可読性を上げる • フレームワーク‧カスタムのTest Utilityの活⽤によ り、より意図を語るテストへ

Slide 93

Slide 93 text

© - BASE, Inc. 振り返り:主に期待する効果 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 94

Slide 94 text

テスト容易な設計

Slide 95

Slide 95 text

© - BASE, Inc. 重複を最⼩限に

Slide 96

Slide 96 text

© - BASE, Inc. 主に期待する効果 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 97

Slide 97 text

© - BASE, Inc. テスト容易な設計 • テストコードに対する意識‧改善では、費⽤対効果の ⾼いテストは実現できない • プロダクションコードのテスタビリティの向上‧改善 が必要

Slide 98

Slide 98 text

© - BASE, Inc. TDD テスト容易な設計

Slide 99

Slide 99 text

© - BASE, Inc. TDD - Test-Drive Development • プログラム開発⼿法のひとつ • 「動作するきれいなコード」をゴールとする • Red-Green-Refactor のサイクルを回す • 最初に Red にするため、テストファーストで進める

Slide 100

Slide 100 text

© - BASE, Inc. TDDとテスト容易性 • テストファーストによって、テスト容易性が強制され る • テストから先に書くため、基本的な⽋陥はテスト実⾏ によって気がつくことができる • テスト実⾏だけで実装中のコードをデバッグできる

Slide 101

Slide 101 text

© - BASE, Inc. TDDによるテスト容易性の強制について https://speakerdeck.com/hgsgtk/tesutokaxin-iwojie-jue-surutesutoqu-dong-kai-fa-falseahuroti-at-phpkanhuarensuxian-tai-2019

Slide 102

Slide 102 text

© - BASE, Inc. 振り返り:主に期待する効果 Ϣχοτςετ ʹΑΔ ίετ࡟ݮ Ϣχοτςετ ͷ ࡞੒ɾҡ࣋ίετ VS • खಈϢχοτςετͷίετ • ܽؕͷૣظൃݟʹΑΔमਖ਼ίετ • υΩϡϝϯςʔγϣϯίετ • σόοάίετ • ઃܭվળʹΑΔϝϯςφϯείετ • ৽نςετ࡞੒ίετ • طଘςετҡ࣋ίετ • ςετ࣮ߦ࣌ؒͷ଴ͪίετ • ࣗಈςετͷͨΊͷCIҡ࣋ίετ • Ϣχοτςετͷֶशίετ

Slide 103

Slide 103 text

© - BASE, Inc. まとめ:考え⽅と実践 - 「How Testing?」 • コスト削減を達成するための「考え⽅」 • 考え⽅に基づいた「実践」によって、効果を得る

Slide 104

Slide 104 text

© - BASE, Inc. ユニットテストについて話すこと 考え⽅と実践 - 「How Testing?」 ⽬的 - 「Why Testing?」 まとめ - 「That’s why Testing」

Slide 105

Slide 105 text

© - BASE, Inc. 良いテストを書くのは難しい • 「テストを書く」ことは⽐較的簡単 • 費⽤対効果の⾼いテストを書くのは難度が上がる • 費⽤対効果の⾼いテストを⽬指すのは、考えて実践し ていく必要がある

Slide 106

Slide 106 text

© - BASE, Inc. 費⽤対効果を⾼めるには “テストにコストがかかることの解決⽅法は、テストを やめることではありません。うまくなることです。” Sandi Metz. オブジェクト指向設計実践ガイド 〜Rubyでわかる 進化しつづける柔軟なアプリケーションの育て⽅ https://gihyo.jp/book/2016/978-4-7741-8361-9

Slide 107

Slide 107 text

Enjoy Happy Testing Life 👋

Slide 108

Slide 108 text

© - BASE, Inc. 補⾜:参考書籍 『xUnit Test Patterns: Refactoring Test Code』 https://www.amazon.co.jp/dp/ / ref=cm_sw_r_tw_dp_U_x_Y kJCb EX F 『オブジェクト指向設計実践ガイド 〜Rubyでわかる 進化しつづける柔 軟なアプリケーションの育て⽅』 https://gihyo.jp/book/ / - - - -

Slide 109

Slide 109 text

© - BASE, Inc. 補⾜:関連資料 xUnit Test Patternsから学ぶ12個のユニットテストの原則 https://qiita.com/hgsgtk/items/a a d d b d xUnit Test Patternsから学ぶユニットテストの6つの⽬指すべきゴール https://qiita.com/hgsgtk/items/ daa d dac xUnit Test Patternsから学ぶテストアンチパターン https://speakerdeck.com/hgsgtk/testing-anti-pattern-learned-in-xunit-test- pattern ユニットテスト初⼼者を脱するために⾝につけたいN個のこと https://speakerdeck.com/hgsgtk/n-points-to-get-out-of-unit-test-beginner- number-phpstudy

Slide 110

Slide 110 text

© - BASE, Inc. 補⾜:関連資料 テストが⾟いを解決するテスト駆動開発のアプローチ https://speakerdeck.com/hgsgtk/tesutokaxin-iwojie-jue-surutesutoqu-dong- kai-fa-falseahuroti-at-phpkanhuarensuxian-tai- PHPバージョンアップと決済リプレイスを⽀えたユニットテスト https://speakerdeck.com/hgsgtk/phpbaziyonatuputojue-ji-ripureisuwozhi- etayunitutotesuto-number-phpcon テストを書いたことがないエンジニアがテストを書けるようになるまで やったこと https://speakerdeck.com/hgsgtk/tesutowoshu- itakotokanaiensiniakatesutowoshu-keruyouninarumateyatutakoto-at- phpkanhuarensuguan-xi-