Amazon Web Services ブログ

Amazon CodeWhisperer でコードカバレッジの先を見る

この記事は Looking beyond code coverage with Amazon CodeWhisperer (記事公開日: 2024 年 1 月 8 日) の翻訳記事です。

コードカバレッジは、ユニットテストによりコード品質を計測するメトリクスです。すべてのパラメータの組み合わせに対するテストケースを考えるのには時間がかかりますが、開発者の時間は貴重なものになっています。開発者の焦点は、カバレッジのしきい値を満たすことのみに(誤って)向けられます。その結果、コードの品質が損なわれ、予期しない結果をもたらすコードが残る可能性があります。

この記事では AI コーディングコンパニオンの AI コーディングコンパニオンの Amazon CodeWhisperer を活用して、Java アプリケーションをウォークスルーします。時間とリソースの制約によりしばしば見過ごされがちな境界条件を含むテストケースの組み合わせを生成するコードカバレッジの先を見る方法をデモします。このアプローチを取ることで、コードの品質と生産性の両方を向上させることができます。

前提条件

  1. AWS アカウントを作成してください。AWS アカウントをまだお持ちでない場合は、AWS Management Console にアクセスするためにアカウントの作成が必要です。このため、新しいユーザーを作成することをおすすめします。
  2. CodeWhisperer を開発環境にセットアップするには、AWS Toolkit のセットアップ手順に従ってください。
  3. Java をダウンロードおよびセットアップ: Java SE Development Kit をインストールしてください。
  4. Maven をインストールしてください。
  5. VS CodeIntelliJ など、使用したい IDE を選択できます。このブログでは IntelliJ コミュニティエディションを使用しています。ダウンロードはこちらから。Ultimate 版のライセンスをお持ちの場合はそちらを使用できます。
  6. リポジトリをクローン: Looking beyond code coverage with CodeWhisperer
  7. IntelliJ にインポートしたプロジェクトについては、プロジェクトのインポートガイドに従ってください。

上記のステップに従うと、プロジェクトをローカルにセットアップできます。以下の図 1 は、IDE に Maven プロジェクトとしてインポートした後の初期プロジェクトの見た目を示しています:

Figure1. initial Java project

図1. Java プロジェクトの初期状態

次の画面録画 1 は、「//method for adding two numbers」 というコメントを使用して「add」メソッドのコードを生成するために、CodeWhisperer を使用する方法を示しています。

ScreenRecording 1. Initial application code generation

画面録画 1. 最初のアプリケーションコードの生成

それでは、画面録画 2 で示したように CodeWhisperer を使用して、1 つのシンプルなテストケースを生成してみましょう。最初のテストケースの生成:

ScreenRecording 2. First test case generation

画面録画 2. 最初のテストケース生成

テストケースを実行して、コードカバレッジを確認しましょう。図 2 の「最初のコードカバレッジを用いた最初のテスト」では、Calculator クラスで 100% のカバレッジを達成したことがわかります。カバレッジのみを見ると、コードが準備完了であると言えます。

Figure2. First test with code coverage

図 2. コードカバレッジを用いた最初のテスト

1 つのユニットテストだけでは、品質が高く副作用のないコードを保証することはできません。 次に、CodeWhisperer が追加のテストケースの生成を支援する方法を見ていきます。 「// Test」 といったコメントの入力を開始するとすぐに、「// test with one negative number」、 「// test with two negative numbers」、 「test with one zero number」 など、新しいテストケースの提案が表示されます。 以下の「追加のテストケースの生成」と題された画面録画 3 で示されているように、さまざまなテストケースを生成する作業が容易になり、開発者はより短時間で多くのテストを作成できるようになります。

ScreenRecording 3. Generating additional test cases

画面録画 3. 追加のテストケースの生成

ここまで、異なる引数でテストケースを生成し、コードカバレッジ 100% を達成してきました。 次はコードの安全性に焦点を当て、予期しない結果につながる可能性のあるさまざまな引数について考えていきましょう。 各引数は、-2,147,483,648 (int 型の最小値) から 2,147,483,647 (int 型の最大値) の範囲内である必要があります。 以下の画面録画で示すように、CodeWhisperer を使用してコードの安全性を検証するための追加のテストケースを生成しましょう:

ScreenRecording 4. Generating test for boundary conditions

画面録画 4. 境界条件のテストの生成

ここでまず、CodeWhisperer は整数の最大値に 1 を加えるテストケースを生成しました。そして 実行時に 「add」 メソッドが返す実際の値を確認できるように、結果をコンソールに出力するステートメントも追加しました。: ここで注目すべきは、生成されたテストケースが int 型の最小値が出力されることを期待している点です。 テストを実行すると、テストケースの結果が予期しないものであることがわかります。 符号付き整数の演算の仕組みのため、最大の int に 1 を加えると最小値になります。 より実践的な観点から考えてみましょう。銀行システムで 「add」 メソッドを使用し、顧客が銀行口座に預金するたびに、最近の預金額を加算して口座の最終金額を計算する場合を想像してください。今度は、21.4 億ドルを預金した後に口座残高がマイナスになり、高額を支払わなければならないことを顧客が発見したときの反応を想像してみてください。

この例は、100%のカバレッジを持つコードでも予期しない副作用があることを示しています。焦点を当てるべきは、予期しない結果をもたらすパラメータの組み合わせを特定することです。そうすることで、コードを製品にこのような動作が現れる前に修正できます。

次に、CodeWhisperer を使用して、予期しない結果を生み出す可能性のある別のテストケースを生成してみましょう: 「’int’ の最小値に -1 を加える」。 再び、int の最小値に -1 を加えると、最大値が結果として得られます。 上記の例と同様に、お客様は 21.4 億ドルを引き出した後でも、銀行口座にまだお金があることに気づいて大喜びするでしょう。

再度述べますが、ポイントは開発者はカバレッジ目標を追求するよりも、コードが意図しない予期しない結果をもたらさないことを確認することに注力するべきだということです。

add メソッドが特定の条件下で整数オーバーフローを起こすことがわかったので、 「check a and b for integer overflow」 というコメントを使用して、CodeWhisperer を使ってコードを改善しましょう。

ScreenRecording 5. Code improvement- overflow check

画面録画 5. コード改善-オーバーフローチェック

安全チェックを追加した後、テストケースは予期しない結果をもたらさず、上記のスクリーン録画で示されているように ArithmaticException を発生させています。 しかし、テストケースは失敗しており、失敗したテストケースは CI/CD パイプラインを中断させる可能性があります。 したがって、以下の画面録画で示されているように、この実行時例外を期待するようにこれらのテストケースをリファクタリングし、テストケースをパスさせる必要があります。

ScreenRecording 6. Test case improvement- overflow checks

画面録画 6. テストケースの改善-オーバーフローチェック

テストケースをカバレッジとともに再実行した結果、テストケースがパスしているだけでなく、100% のコードカバレッジが得られていることがわかります。

このブログのコードと対応するテストケースの大部分は、AI コーディングコンパニオンの CodeWhisperer によって生成されました。このツールを使用することで、ライブラリを簡単に検索してコードを強化できます。この例では、 「Math.addExact」 メソッドを利用することにつながりました。これは、タスクに関連する境界条件のチェックを提供します。以下の図 3 の最終コードで示すように、このメソッドを利用するようコードをリファクタリングしましょう。

Figure 3. Final code

図 3. 最終コード

テストスイートをカバレッジとともに再実行すると、すべてのテストケースをパスしており、カバレッジも 100% が維持されていることがわかります。

Figure 4. Final tests with coverage

図 4. カバレッジを含む最終テスト

結論:

この記事を通じて、高いコードカバレッジだけでは高品質なコードが保証されないことを示しました。 Amazon CodeWhisperer のようなツールは、境界条件を含むコードと対応するテストスイートを生成することで、開発者の生産性を向上させることができます。これにより、開発者はビジネスロジックに集中し、新しいフレームワークとライブラリを学ぶことができ、結果として、コードの品質と安全性が全体的に向上します。

Java に焦点を当てた例でしたが、このコンセプトは他のプログラミング言語にも適用できます。 CodeWhisperer がサポートしているプログラミング言語と IDE の完全なリストは、FAQ をご覧ください。

CodeWhisperer の Individual Tier を無料でお試しいただき、CodeWhisperer スタートガイドを使用して、より効率的に高品質なコードを書くのにどのように役立つか確認してみてください。

コーディングを楽しんでください!

翻訳はソリューションアーキテクトの江口昌宏が担当しました。

   
Saurabh Kumar's picture

Saurabh Kumar

Saurabh Kumar は、ノースカロライナ州 Raleigh を拠点とする AWS のソリューションアーキテクトです。移行からモダナイゼーション、最適化に至るまで、お客様がビジネス上の課題や技術的な問題を解決できるよう支援することに情熱を注いでいます。仕事以外では、ガーデニングや家族との時間を過ごすのが好きです。

Bineesh Ravindran's picture

Bineesh Ravindran

Bineesh はアマゾンウェブサービス (AWS) のソリューションアーキテクトで、テクノロジーに情熱を持ち、お客様の問題解決を支援することが大好きです。Bineesh はエンタープライズアプリケーションの設計と実装に 20 年以上携わってきました。AWS のパートナーやお客様と協力して、スケーラブルなアーキテクチャを構築し、AWS サービスの採用を促進するための戦略を実行するためのアーキテクチャガイダンスを提供しています。仕事をしていないときは、サイクリング、アクアスケープ、バドミントンを楽しんでいます。