テスト駆動開発(TDD)オンライン勉強会 #1 に行ってきた #tdd_online

先日、テスト駆動開発(TDD)オンライン勉強会 #1 に参加しました。今回はオンライン開催。簡単に所感をまとめます。

ddd-community-jp.connpass.com

所感

ライブコーディングが2本ありました。TDD のセッションで FizzBuzz 以外の題材が見れたのはとても参考になりました。途中でググったり普段の生々しい感じのコーディング風景が見れてなかなか面白かったです。

FizzBuzz の TDD と言えば、de:code 2017 で t_wada さんが公演されていた動画がとてもわかりやすいです。今回、コメント欄にもいらっしゃって大変学びがありました。

channel9.msdn.com

TDD や自動テストの特徴や課題について、感覚的になんとなく理解はしているつもりでも、きちんと言葉で説明されるとなるほどと思うところがあります。特に自動テストと TDD の違いやカバレッジのあたりの話とか。

以前、TDD (モドキ) を実践してみましたが、リファクタリングや機能追加に対して安心感があって、やはりそのあたりは TDD の大きなメリットかなと思います。最近はテストがほぼないレガシーな環境にいるので、まずは自動テストから取り組まなければ...。

TDD とは関係ないけど、JUnit の diff のビューが便利そう。Eclipse でも使えるんだろうか。あと、懇親会は参加してないけど、spatial.chat が面白そう。Vue.js が使われてるっぽい。

以下、メモから抜粋。

ライブコーディングで体感するTDD基礎

https://youtu.be/UhHdnLTxOjEyoutu.be

  • TDDはDDDとも相性がよい
  • Red-Green-Refactor
  • TDDは開発スタイルであり教義ではない
    • 手段が目的になってはいけない
  • TDDだけで十分に品質保証できるわけではない
  • 必要なければリファクタリングはスキップしてよい
  • ステップを細かくすると過剰な設計を防げる
    • Red ⇒ Green までに時間がかかるときは過剰な設計を疑う☆
    • 差分が大きいとテストコード外の不具合を埋め込んでいるかも
    • フィードバックサイクルの短さが大事
  • @ParameterizedTest, @CsvSource, @MethodSource (JUnit)
  • ループで回すと各テストを展開してくれない
  • Parameterized Test
    • 期待値ごとに分けるかどうかはテスト対象の性質とテストコードの可読性による
    • テストコードから仕様が読み取れるか
    • 同値分割における同値クラスを増やす場合に楽?☆
  • リファクタリングしたテストコードがきちんと動作するかプロダクションコードをわざと壊してテストが落ちることを確認することも大事 (テストのテスト)
  • TDDと自動テストは解決したい課題が異なる☆
  • 自動テスト
    • 自動テストはTDDがなくても実施できる
    • 自動テストは回帰テストの実行コストを抑える
    • リファクタリングしやすく
    • テストコードに想定される挙動が記述される
    • ドキュメントと違って形骸化しない (実行可能ドキュメント)
  • TDD
    • 十分なテストが書かれやすい
    • カバレッジは「足りないこと」は不足はわかるが「十分であること」の根拠には使えない☆
    • テストが書きにくい設計であることに気付く
    • 自然と高凝集/低結合なクラスを書くようになる☆
  • 外部APIはモックにする
    • Dockerで代用するのもあり?
  • Red からなかなか Green にならないと正しい方向に進んでいるか分からない
  • Red-Green-Refactorの うち Refactor のところで設計する☆
    • Red-Green のうちは汚くてもいいからとりあえず通す
  • ToDoリスト
  • テストしやすくするためにメソッドを括り出す
    • テスト観点が明確になる
  • 1テストメソッドにまとめるとテストのバリエーションを増やしにくい
  • カバレッジが100%でもアサーションが十分かどうかは分からない☆
    • テストから書いた方が抜けにくい
  • 自動テストはMust/TDDはWant
    • TDDは開発の進め方なので強制しにくい
  • テストコードの保守コスト
    • 自動テストの問題 ⇒ 解決するにはテストを書くスキルが必要
  • TDDだけでは品質は担保できない
    • テスト戦略の問題 ⇒ UT以外に全体としてどうするか
  • テスト実装工数
    • 自動テストの問題 ⇒ 長期的に回帰テストのコスト削減になるかで判断
  • TDDの問題の多くは自動テストの問題であることが多い