Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テスト駆動開発試してみた発表

 テスト駆動開発試してみた発表

自作のTwitterbotアプリのリファクタリングついでに、TDDを実際に取り入れてテストコードを書いてみました。
その際得られた知見を共有します。

tarohida

June 10, 2020
Tweet

More Decks by tarohida

Other Decks in Programming

Transcript

  1. テストとは? 説明のため3種類に分類してみる (t-wada独自) - Developer Testing:開発者用 - Customer Testing:進捗管理用 -

    QA Testing:品質管理用 TDDで用いるのは、開発者が開発者のために書くテスト、フィードバックを得るためのテ スト、Developer Testingとここでは位置づける https://gihyo.jp/dev/serial/01/tdd/0003
  2. Developer Testing > 先述したように,テスト駆動開発におけるテストというのは,品質のためのテストでは ありません。テスト駆動開発でのテストの位置づけは,開発を先に進めて行くための「は ずみ車 」 ,開発を前に進める「原動力」です。 > 自分が書いたコードは自分でテストします。そして,テストを書くことで,フィードバック

    を得ることができます。「 次はこうしなきゃいけないはずだ」「 こういうコードのほうがいい んじゃないか」――テストがもたらしてくれる情報をもとにコードをより良くしていこうという のが,テスト駆動開発におけるテスト,つまりDeveloper Testingの役割です。 https://gihyo.jp/dev/serial/01/tdd/0003
  3. テスト駆動開発をしばらく取り入れてみて メリット - エラーが出た際、自分のどの作業によってバグが発生したのかがわかりやすくなっ た - これは、すごく小さいループを回した結果得られた効果 > 失敗するテストを書いてから、最初に行う実装はどのようなものだろうか ―

    ベタ書きの値を返そう。それでテストが通るようになったら、ベタ書きの値をだんだん本物の式や変 数に置き換えていく。 >「テスト駆動開発」Kent Beck著 和田卓人訳 P.217 「グリーンバーのパターン」
  4. テスト駆動開発をしばらく取り入れてみて メリット > エラーが出た際、自分のどの作業によってバグが発生したのかがわかりやすくなった 効果を実感したテストケース /** * @depends testConstruct */

    public function testCreateMessage(OnanieCounter $onanieCounter) { $user_id = '12121212121212121'; $screen_name = 'taro'; $user_name = 'Taro'; $this->assertSame("@taro Taroさんの一日あたりのツイート数は0.25回です\n, tweet_counter->createMessage($user_id, $screen_name, $user_name)); }
  5. テスト駆動開発をしばらく取り入れてみて メリット > エラーが出た際、自分のどの作業によってバグが発生したのかがわかりやすくなった テストケースに対応するメソッド public function createMessage(string $user_id, string

    $screen_name, string $user_name): string { $tweet_count = $this->getTweetCount($user_id); return "@{$screen_name} {$user_name}さんの一日あたりのツイート数は{$tweet_count}回です\n"; }
  6. テスト駆動開発をしばらく取り入れてみて メリット > エラーが出た際、自分のどの作業によってバグが発生したのかがわかりやすくなった テストケースに対応するメソッド public function createMessage(string $user_id, string

    $screen_name, string $user_name): string { $tweet_count = $this->getTweetCount($user_id); return "@{$screen_name} {$user_name}さんの一日あたりのツイート数は{$tweet_count}回です\n"; }
  7. テスト駆動開発をしばらく取り入れてみて 気づいた点 > - インスタンスに状態をもたせると、テストを実施しにくくなる - 同じことを言っていた記事 > このとき、悪性の Singleton

    が入力にあると、テストコードから Singleton を意図した状態へもっていく必要がでてき ます。すると、テストコードの実行前に Singleton の状態に応じた分岐を書く必要がでてきます。これはテストの本質と は関係のないコードであるため、テストコードの記述量を余計に増やす上に、見通しをとても悪くさせます https://qiita.com/Kuniwak/items/4314451227f4d5eaa6b8#%E8%87%AA%E5%8B%95%E3%83%86%E3%82%B9%E3 %83%88%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A8%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81% 93%E3%82%8B%E3%81%AE%E3%81%8B - また、インスタンスを生成するまでの事前準備の処理がすごく長くなる
  8. テスト駆動開発をしばらく取り入れてみて 気づいた点 > - テストケースによるDB操作は、そこまで時間がかからなかった - ただし、DB操作をテストに盛り込むのはアンチパターン - TDDにおいては、DBから値を直接取り出すのは NG、テストコードから直接サンプルの値を引き渡

    すのが望ましい - 速度だけ考えれば、 DBから引っ張ってきた値で代用することはできそう 今回:sqlダンプで本番環境から吐き出した sqlを手元dockerのpostgres環境に流し込んで、本番環 境で利用していたレコードをテストでも利用 https://openmoji.org/library/#search=thinking&emoji=1F914