AI時代のテスト駆動開発


こんにちは、KENTEM第一開発部のS・Mです。
数年前までは考えられなかった生成AIが、今や盛り上がりを見せています。
私としても仕事が様変わりする…とまでは行かないまでも、頼れる相棒として日常的に活用するようになりました。
しかし品質の担保が課題となり、コードとして採用することを躊躇してしまいます。
また、生成AIが出力したコードのチェックに時間を費やし、効率化にならないという声も聞かれます。
そこで、テスト駆動開発と組み合わせることで、安心して使えるのではないかと考えています。

テスト駆動開発について

まずテスト駆動開発について簡単な説明を…Copilotに求めたところ以下のような回答を得ました。

テスト駆動開発(Test-Driven Development, TDD)は、ソフトウェア開発手法の一つで、コードを書く前にまずテストケースを作成することを基本としています。以下はTDDの基本的な流れです:

テストの作成: まず、実装しようとしている機能のテストケースを作成します。このテストは、まだ実装されていないため、最初は失敗します。
コードの実装: テストをパスするために必要な最小限のコードを実装します。この段階では、コードはシンプルであることが求められます。
リファクタリング: テストがパスしたら、コードの品質を向上させるためにリファクタリングを行います。この際、テストが再度パスすることを確認します。
このプロセスを繰り返すことで、バグの少ない、保守性の高いコードを作成することができます。TDDの主な利点には、コードの品質向上、バグの早期発見、設計の改善などがあります。

フローチャートで表すと以下のようなイメージでしょうか。
(Copilotで生成したかったのですが、良い感じにできませんでした…。)

個人的にはテスト駆動開発に以下の強いメリットを感じ、業務でも積極的に取り入れています。

  • テストケースを作成する中で境界値や例外処理など細かな仕様について配慮ができ、品質向上に繋がる。
  • テストケース作成タスクと実装タスクの分離が可能で、作業分担がしやすい。


そして、上記のフローで「リファクタリング」の存在を気にしないのであれば、極論ですが「実装」はブラックボックスでも構わないということになります。
テーマに沿って言い換えると、テストケースを完璧に作成し、生成AIによって出力されたコードが全てのテストケースをクリアすれば、無条件に採用しても良いと言えます。

さらに言えば、テストケースの作成もある程度生成AIに任せることができます。
従来からのテスト駆動開発と生成AIによるコード生成は非常に相性が良いですね。

生成AIを用いた開発手順

さて、ここからはテスト駆動開発と生成AIを組み合わせて開発する際に、効率が良いと思われる手順を紹介します。
同じくフローチャートで表します。

手順は増えますが、生成AIを利用することで確実に時短になります。
各手順の注意点などを説明します。

※1
入力するプロンプトでは生成されるテストケースをそのまま使いたい、生成されるテストケース数を増やす為に以下のような文言を足す必要があります。

C#で XXX を判定するコードとテストケースを20個、以下の点に考慮して出力してください。
・テストケースはMSTestで実行します。
・境界値や例外を考慮してテストケースを生成してください。

※2
生成された本体コードの中身は一旦無視します。
関数のインターフェース(戻り値、引数)のみ採用し、最小限のコードを実装します。

※3
生成されたテストケースを確認し、必要に応じて修正します。
残念ながら、生成AIの出力では境界データのテストケース生成が不足しがちです。
追加すべきテストパターンがないか検討し、対応しましょう。
品質を保証する大事なフローなので、丁寧に進めてください。

以上の流れになります。
これで従来のテスト駆動開発フローと大きく変わらず、品質を損なわずに開発効率向上になるかと思います。

残念ながら、生成AIが十分に理解できない仕様を入力しても、期待する結果が得られないこともあります。
その際は、機能を分解して進めるなどの工夫も必要になります。

おわりに

コードとして採用するかどうかは、最終的にプログラマの責任です。どれだけ便利になっても、私たち自身が学習を止めてはいけませんね。
生成AIを効率良く利用して、より良い製品開発を進めていきます。

KENTEMでは、様々な拠点でエンジニアを大募集しています!
建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。
recruit.kentem.jp career.kentem.jp