BDD, TDDを始めたいです・・・

先日、以下のような記事を書かせていたいただきました。

kz-ike.hatenablog.com

ようやくアプリをリリースできたわけですが、まだまだアプリは進化していく予定です!

さて、進化ということで「継続的にアプリを成長させる」ためには、アプリの品質も担保してかないとですよね。
私のアプリは残念ながら自動テストには対応していないため、実機を使った「手動」での動作確認しかできていません。

「アプリをapple storeにリリースする!」という気持ちが強かったので「品質」という観点での開発をあまり意識していませんでした。
なんとかリリースもできたので、このタイミングで「テスト環境」を導入していこうと考えています。

と同時に「先にテストコードを書いてあとで実装する」というTDD(テスト駆動開発)を、自作アプリの開発プロセスとして取り入れていきたいです。

本記事では、テストファースト開発プロセスである「TDD」及び「BDD」について概念を説明し、テストコードを書き始めようとした中で気づいたしくじり事例を書き留めたい思います。

ちなみに、私が参考にしている本は以下です。
PEAKS(ピークス)|iOSテスト全書

開発プロセス

What's TDD?

概念

最初に失敗するテストコードを書き、それを駆動源としてプロダクトコードを開発するスタイル。

メリット

1. テストを成功させるためにどのように実装するかではなく、「何が欲しいか」から考えることができる
 →「何が欲しいか」ということで、インターフェースの検討から始まる
 →インターフェースを使用することで、依存性注入を考慮したコードをかけるので
  テストダブル(モック。スタブなど)を実装しやすくなる

2. テストコードが必ず用意され、リファクタリングが楽になる
 →失敗のケースから始まるため、失敗時の処理も検討できる

What's BBD?

概念

TDDの派生系で、「振る舞い」と「要求仕様」価値を置いた開発プロセス

ポイント

BBDの概念で「振る舞い」、「要求仕様」という単語を出しましたが、もう少し深掘りします。
冒頭で挙げた書籍で、外側の品質、内側の品質と言った二つの考えが説明されていました。ざっとまとめると以下のようになります。

品質の種類 視点
外側の品質 利用者から見たソフトウェアの品質(要求仕様) 必要な機能が満たしているか、操作性など
内側の品質 開発者から見たソフトウェアの内部構造における品質(振る舞い) コードの可読性、クラス設計が適切であるかなど

筆者の知識がまだ浅くて申し訳ないのですが、

テストコードの意図が人間にとって解釈しやすいように(振る舞いとして理解できるように)にテストコードを実装しよう、
そのために専用のライブラリを使用しよう。

と言った考えが「振る舞い」のポイントかなと現時点で理解しています。

★BBDの枠組みを提供するテスティングフレームワークでQuicl/Nimbleというものがあるそうで使ってみようと思います。

しくじり事例(私のアプリで感じたこと)

  • 内部APIの振る舞い方が把握できていない

「要求仕様」に対する「振る舞い」のテストコードを明記することで、内部APIがどのように動いているか?把握しやすくなります。

残念ながら、今回私は欲しいと思った機能に対していきなり「実装」から始めてしまっていたため(ある程度プロトコルの設計はしていたものの)、今回テストコードを書いていこうと思った際に、自分の実装した機能が内部でどう振る舞っているかわからない状況になってしまっていました


内部の振る舞いが理解できていない

(新しい機能の追加・改造を実施する際に)既存機能にどの部分に影響するか判断つかなくなってしまう

大変


★現在、要求仕様(自身のアプリの機能)に対する、全ての内部APIにおける振る舞いをトレースする作業を始めております・・・

  • 失敗時のケースを実装できていない

TDDのメリット2. にて「失敗のケースから始める」と記載しましたが、失敗のケースから始まるということは失敗時の処理もその時点で検討できるということです。
自身のコードを振り返ると、正常時の動作が通るように実装してしていたため、バグは実際に動作確認している中で発見した物しか発見できていないということになります。

ですので、想定しないケースでアプリがクラッシュしてしまうといった問題が発生してしまうかも、と考えるとアプリを使っていただいているユーザには非常に申し訳なく思います。


★「内部APIのトレース作業」と並行して、失敗時の挙動を整理中・・・

最後に

現在本記事を執筆している時点で、まだBDDのライフサイクルを回せていません。
ある程度、内部での振る舞いを整理できたら、次の機能実装にてBDDの開発プロセスを取り入れていこうと思います。

まずは、簡単な機能追加でBBDを回してみよう・・・!