クラウドでは、アプリケーション開発を、それに付随するインフラと一緒にエンドツーエンドで扱うことができる。これにより、テスト駆動開発(TDD)やリファクタリングをアプリケーション全体で使用することが可能になり、メンテナンスコストを下げることができる。
Michal Svoboda氏がXP 2023でクラウドアプリのテスト駆動開発について講演をする。このカンファレンスは、6月13日から16日までオランダのアムステルダムで開催される。
クラウドアプリの場合、アプリケーションは付随するインフラとともに、1つのまとまったコードとして開発・デプロイできる。Svoboda氏によると、「インフラ」を別の要素として取り除くことで、クラウドリソースを含むアプリ全体の範囲で、TDDやリファクタリングといったアジャイルエンジニアリングの手法を適用できる。
クラウドの遅延時間と非同期性が問題になることがある。リソースのプロビジョニングやタイムアウトの経過を待つことは、迅速なTDDサイクルを阻害する。Svoboda氏は、インクリメンタルアップデートモデルに切り替えること、つまり、各テストの終了時にリソースを破棄せず、統合時のみクリーンなデプロイメントができるように提案している。
テストのスピードアップのテクニックは、TDDのテクニック集から引き出されたものです。状態ベースのテストを戦術的に使用したり、コードの変更部分のみをテストしたりするのは、その一例です。テストのハードルは、開発サイクル全体に有益なフィードバックを与えるものであることを忘れてはならないです。このフィードバックによって、私たちはアーキテクチャと手続き上の選択を慎重に検討するようになりました。
Svoboda氏によると、TDDはソフトウェアのTCOの大部分を占めるアプリのメンテナンスコストを削減ができる。TDDを使えば、自分のコードでもクラウドリソースの利用でも、何年経っても簡単に機能追加やリファクタリングを行える。
InfoQは、Michal Svoboda氏にTTDを使ったクラウド開発についてインタビューした。
InfoQ: クラウドは、インフラのプロビジョニング方法にどのような影響を与えたのでしょうか?
Michal Svoboda氏: APIを通じて、クラウドリソースを完全に自動化した方法で作成・破棄できます。(厳密には、これはクラウドに限ったことではありません。クラウドプロバイダーがこの機能を極めて身近なものにしているだけなのです)。アプリケーションとは別に存在するサーバーやネットワークのような「インフラ」について考える必要はないのです。「インフラ」は、もはや特別なアプローチを必要としないのです。
クラウドは、従来のインフラの上に、ストレージ、機能、ストリームなどの単一専門サービスを提供します。多くのクラウドアプリは、クラウド上で動作するだけでなく、クラウドを構成しています。
InfoQ: クラウドアプリのテスト駆動開発はどのように行っているのでしょうか?
Svoboda氏: クラウドアプリのTDDは、他のアプリのTDDと似ています。メモリ上にオブジェクトを作成するためにコンストラクタや関数を呼び出す代わりに、クラウド上にリソースを作成するためにAPIを呼び出します。ストリーム・リソースのarrange(準備), act(実行), assert(検証)テストは、以下の擬似コードに示されています。
[ストリームの書き込み、読み出しができることをテストする。]
1.ストリームロールとリード/ライトロールを展開する。
2.ライターロールを使用してデータをストリームに置く。
3.リーダーの役割を用いてストリームをポーリングし、正しいオブジェクトを受信するか、タイムアウトになったことを検証する。
4.ストリームとロールを削除する。
これは、非常にシンプルな機能テストです。状態ベースのテストは、リソースの「設定を問い合わせる」APIコールを使って実行できます。より複雑なリソースの設定も、同じ原理でテストできます。
TDDのように、まずテストを書いて、失敗して、その後に実装を行います。重要なのは、フィードバックに耳を傾け、テストの難しさを開発の原動力にすることです。私たちの技術、アーキテクチャ、手順の選択は、テストのしやすさを基準にしています。
InfoQ: どのような課題に直面し、どのように対処したのでしょうか?
Svoboda氏: 利用可能なツールは問題でした。このクラウド上のTDDアプローチをうまく機能させるためには、リソースデプロイメントコードが、選択したプログラミング言語において優等生でなければなりません。最新のツールは、「クラウドMakefile」方式で、独自の言語によるモデル上のコマンドラインインターフェイスを提供します。これらのツールは「分離したインフラ」のパラダイムに従っているため、それらと通信するのが面倒になることがあります。これは、開発の初期に得られた素晴らしいフィードバックであり、私たちのツールやプロバイダーの決定を左右するものでした。
InfoQ: コスト削減の他に、クラウドアプリのTDDを行うことで得られたメリットは何でしょうか?
Svoboda氏: テストによって、エッジケースを考慮することが可能になりました。アプリケーションは安定していますし、何が起こるかもわかっています。クラウドプロバイダーと一緒に、いくつかの荒削りな部分を解決できました!
私たちのアプローチは、リソースのセットアップとテストが非常に簡単だったため、プロトタイプの段階でも恩恵を受けることができました。クラウドは複雑な環境なので、プログラミングのミスや間違った機能の想定により、数え切れないほど失敗しました。このアプローチを使うことで、素早く失敗できたのです。
多くの重要な疑問は、開発の初期に現実的に解決されました。どのような技術を使うのか?どのようにアプリケーションを展開し、運用するのか?長期間の状態や機密データをどのように管理するのか?
InfoQ: クラウドアプリでTDDを試したい人へのアドバイスをお願いします。
Svoboda氏: まずは小規模なプロジェクトでゆっくり始めてください。最初のテストをパスさせる前に、しておかなければならないことがいくつかあるはずです。仕組みに慣れること。積極的にリファクタリングすること。フィードバックから学ぶこと。幸運を祈ります!