Gemini Code Assist を使用したテストの概要

1. はじめに

このラボでは、Google Cloud の AI コラボレーターである Gemini Code Assist を使用して、既存の Python ウェブ アプリケーションにテストを追加し、テストによって公開されたアプリケーションのエラーを見つけて修正します。その後、コード アシストを使用して新しい機能のテストを作成し、そのテストに合格してアプリを拡張するためのコードを生成します。

演習内容

  • Cloud Shell エディタを使用して、既存のウェブ アプリケーションのコードをダウンロードします。
  • Cloud Shell エディタで Gemini Code Assist Chat を使用して、Google Cloud に関する一般的な質問をします。
  • Cloud Shell エディタで Gemini コード アシストのインライン コード アシスタンスを使用して、アプリケーションのテストの生成、テストの実行、エラーの検出と修正を行い、アプリケーションの機能を拡張します。

学習内容

  • テスト生成やコード生成など、いくつかの開発者タスクで Gemini Code Assist を使用する方法。
  • Gemini Code Assist を使用して Google Cloud について学習する。

必要なもの

  • Chrome ウェブブラウザ
  • Gmail アカウント
  • 課金が有効になっている Cloud プロジェクト
  • Cloud プロジェクトで Gemini Code Assist が有効になっている

このラボは、初心者を含むあらゆるレベルのデベロッパーを対象としています。サンプル アプリケーションは Python 言語ですが、Python プログラミングに精通している必要はありません。ここでは、デベロッパー向けの Gemini Code Assist の機能に慣れることに重点を置きます。

2. セットアップ

このラボで使用する課金が有効になっている Cloud プロジェクトがすでに存在している必要があります。次に、Google Cloud プロジェクトで Gemini API を有効にします。以下の手順に沿って操作してください。

  1. https://console.cloud.google.com にアクセスし、このラボで使用する Google Cloud プロジェクトが選択されていることを確認します。右上に表示される Gemini アイコンをクリックします。

GeminiBanner.png

  1. コンソールの右側に Gemini for Cloud コンソールのウィンドウが開きます。以下に表示されている場合は、[有効にする] ボタンをクリックします。[有効にする] ボタンが表示されず、代わりに Chat インターフェースが表示されている場合は、すでにそのプロジェクトで Gemini for Cloud が有効になっているため、次のステップに直接進むことができます。

GeminiApiEnable.png

  1. 有効にしたら、Gemini にクエリを 1 ~ 2 回入力してテストできます。いくつかのサンプルクエリが表示されていますが、たとえば「Cloud Run とは」のようなクエリを試すこともできます。

GeminiChatWindow.png

コード アシストが質問の回答を返します。右上の f68286b2b2ea5c0a.png アイコンをクリックすると、コード アシスト チャット ウィンドウを閉じることができます。

Cloud Shell エディタで Gemini を有効にする

Gemini Code Assist が利用可能で、いくつかの一般的な IDE でも同様に動作します。この Codelab では、完全にウェブブラウザで実行できる Google Cloud Shell エディタを使用します。Cloud Shell エディタで Gemini を有効にして設定する必要があります。手順は次のとおりです。

  1. 下に示すアイコンで Cloud Shell を起動します。Cloud Shell インスタンスの起動には 1~2 分かかる場合があります。

72dc3df7b007fcde.png

  1. [エディタ] ボタンまたは [エディタを開く] ボタンをクリックし、Cloud Shell エディタが表示されるまで待ちます。[新しいエディタを試す] ボタンが表示されている場合は、クリックします。

CloudShellEditor.png

  1. 下のステータスバーにある [Cloud Code - Sign in] ボタンをクリックします。指示に従ってプラグインを承認します。ステータスバーに「Cloud Code - no project」と表示されている場合は、それを選択して、使用するプロジェクトのリストから特定の Google Cloud プロジェクトを選択します。

CloudCodeSignIn.png

  1. 右下のステータスバーに Gemini アイコンが表示されない場合は、Cloud Code で Gemini アイコンを有効にする必要があります。その前に、IDE で Gemini(旧称 Duet AI for Developers)が有効になっていることを確認してください。そのためには、[Cloud Code Extension] > [Settings] に移動し、以下のようにテキスト「Duet AI: Enable」を入力します。チェックボックスがオンになっていることを確認します。IDE を再読み込みする必要があります。これにより、Cloud Code で Gemini が有効になり、IDE に Gemini ステータスバーが表示されます。

EnableDuetAiSetting.png

  1. 下図のように、右下にある [Gemini] ボタンをクリックし、Cloud AI Companion API を有効にした Google Cloud プロジェクトを選択します。

GeminiSelectGoogleCloudProject.png

  1. Google Cloud プロジェクトを選択したら、以下に示すように、Cloud Code のステータス メッセージのステータスバーに、Gemini が有効になっている右側のステータスバーに表示されていることを確認します。

GeminiEnabledStatusBar.png

Gemini Code Assist を使用できるようになりました。

3. アプリケーションをダウンロードして確認する

ターミナル ウィンドウでコマンドを実行し、開始コードを含むリポジトリのクローンを作成してから、新しいディレクトリに移動します(ターミナル ウィンドウが開いていない場合は、[Terminal] または [Open Terminal] ボタンをクリックして復元します)。

git clone https://github.com/GoogleCloudPlatform/testing-with-duet-ai-codelab.git
cd testing-with-duet-ai-codelab

エディタで main.py を開き、エディタの左側にある Gemini チャット アイコンをクリックして [Gemini Chat] ウィンドウを開きます。この Gemini Chat ウィンドウは IDE 内にあり、ディスカッションのコンテキストとして IDE 内のコードを利用できます。[Explain this] というプロンプトを入力して、回答を表示します。

GeminiChatExplainThis.png

このチャット ウィンドウをスクロールすると、回答全体を表示できます。説明には、ターミナル ウィンドウでコマンド python3 main.py を使用して、このプログラムをローカルで実行できることが示されています。

4. ローカルで実行する

必要に応じて cd ~/testing-with-duet-ai-codelab を使用してリポジトリ ディレクトリに移動し、ターミナル ウィンドウでコマンド python3 main.py を入力します。

3bf558e9cea15375.png

リンク http://127.0.0.1:8080 をクリックして、アプリケーションのホームページへの新しいブラウザタブを開きます。

fb06f382a4c03e4c.png

アプリケーションが「ローカル」で実行されている。実際、Cloud Shell エディタにはちょっとした魔法のような効果があります。アプリケーションは自分のパソコンではなく Cloud Shell で実行されます。リンクをクリックすると、実際のローカル アドレス http://127.0.0.1:8080 ではなく、この目的のためだけに Cloud Shell によって設定されたプロキシ サーバーへのタブが開きます。この効果は、実際にローカルで実行する場合と同じです。

実際に試してみましょう。「25」と入力して [変換] をクリックします。

e1b9d5832f6d0058.png

そうです、25 はローマ数字で XXV です。ここで完了する必要があります。

他の数字も確認してみましょう。25 は有効だった。24 は?

37982e385e17baac.png

すべて大丈夫だと思ったのに少し急いでいたのかもしれません。24 の換算は XXIIII で正しいでしょうか?XXIV じゃない?

XXIIII が正しいという主張はできても、人々が通常期待するものではありません。ただし、これは実際には誤りではないので(多くの時計がローマ数字 IIII として 4 と表示されることに注意してください)、この問題は今後の機能強化のために残します。

負の数を試してみてはいかがでしょうか。ゼロ?これらの数字をローマ数字で表す方法はありません。ユーザーには何も返さないように見えます。対処が必要なエラーのようです。

テストはエラーを見つけて排除するのに役立ち、Gemini Code Assist はテストの作成と使用に役立ちます。

5. テストの追加

Gemini チャット ウィンドウに戻り、

How can I test the number_to_roman function?

レスポンスに目を通します。これには、unittest モジュールと pytest モジュールに関する説明が含まれています。

これらのテストを Gemini Code Assist に実際に作成してもらうこともできます。エディタで実際のコンバージョン コードがある calendar.py を開き、Gemini チャット ウィンドウに戻ってもう一度質問します。

How can I test the number_to_roman function?

これで、レスポンスがより具体的になり、新しいファイルにコピーまたは挿入できる unittest モジュールが追加されました。

import unittest
import calendar

class NumberToRomanTest(unittest.TestCase):

    def test_convert_1(self):
        self.assertEqual(calendar.number_to_roman(1), "I")

    def test_convert_4(self):
        self.assertEqual(calendar.number_to_roman(4), "IV")

    def test_convert_9(self):
        self.assertEqual(calendar.number_to_roman(9), "IX")

    def test_convert_40(self):
        self.assertEqual(calendar.number_to_roman(40), "XL")

    def test_convert_90(self):
        self.assertEqual(calendar.number_to_roman(90), "XC")

    def test_convert_400(self):
        self.assertEqual(calendar.number_to_roman(400), "CD")

    def test_convert_900(self):
        self.assertEqual(calendar.number_to_roman(900), "CM")

    def test_convert_1990(self):
        self.assertEqual(calendar.number_to_roman(1990), "MCMXC")

    def test_convert_2023(self):
        self.assertEqual(calendar.number_to_roman(2023), "MMXXIII")

上記の例とは異なるコードが表示される場合があります。Gemini Code Assist の基盤となるモデルは随時更新されるため、回答が常に同じになるとは限りません。別のコードセットが表示された場合は、ここに示されているコードをコピーして、この Codelab のサンプルで続行するかどうかを選択できます。または、Gemini Code Assist から提供される別の回答を試すこともできます。時間があれば、両方のパスを試すこともできます。Gemini Code Assist は、自由に使えるコーディング アシスタントです。

Gemini チャット ウィンドウの右上にある二重矢印をクリックして単体テストコードを含む新しいファイルを作成するか、IDE を使用して新しいファイルを作成し、このラボで示したコードを貼り付けます。そのウィンドウで Ctrl+S キーまたは CMD+S キーを押して保存し、保存したファイル calendar-unittest.py を呼び出します。

ターミナルに戻り、Ctrl+C キーを押して先ほど実行していたウェブサーバーを停止し、シェル プロンプトを表示します。コマンドを入力します。

python3 calendar-unittest.py

新しいテストを実行します。

出力はありません。これは想定していた動作ではありません。すべてが静かに進みましたか?それを確かめたいと思っています。テストコードを含む Gemini Code Assist からの回答を確認してください。コードの下に、テストケースの実行方法に関する詳細情報がありました。

run-unittest.png

推奨されているコマンドを実行してみてください。

python -m unittest discover

マシンで python3 コマンドのエイリアスを python に設定していない場合、問題が発生する可能性があります。その場合は、次のコマンドを実行します。

python3 -m unittest discover

コマンドは実行されますが、Ran 0 tests in 0.000s が返されます。このモジュールには複数のテストが含まれています。現在の状況

コマンドの最後の単語 discover です。どこから取得したか?Gemini Code Assist は、テストコードが discover または discover.py という名前のファイルに保存されることを想定していましたが、それを指定しなかったようです。ファイルを calendar-unittest.py に保存しているので、次のコマンドを実行します。

python3 -m unittest calendar-unittest

今度は、次のようなものから始まり、多数の出力が表示されます。

$ python3 -m unittest calendar-unittest
.F.FFFFFF
======================================================================
FAIL: test_convert_1990 (calendar-unittest.NumberToRomanTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/charles_engelke/testing-with-duet-ai-codelab/calendar-unittest.py", line 28, in test_convert_1990
    self.assertEqual(calendar.number_to_roman(1990), "MCMXC")
AssertionError: 'MDCCCCLXXXX' != 'MCMXC'
- MDCCCCLXXXX
+ MCMXC

最初の行には、合格したテストごとの期間と、不合格になったテストごとの F が表示されます。ほとんどのテストが失敗しています。次に、失敗したテストを個別に一覧表示し、想定される出力と実際の出力を表示します。これらのテストがどのような順序で実行されたかが少し不明確です。テストがファイルに表示される順序ではなく、テスト名のアルファベット順でした。つまり、最初に test_convert_1、次に test_convert_1990、次に test_convert_2023 というように実行されています。12023 のテストケースのみが合格です。

このコードを初めて試したときに、24XXIIII に変換されていることに気づきました。これはまったく間違っているわけではなく、IIIIIV に変換される一般的な形式ではありません。失敗したテストはすべて同様のケースに対するものでした。この問題が最初に指摘されたとき、研究室は「これは実際には誤りではないので(4 をローマ数字 IIII と表示している時計が多いため)、今後の機能強化のために残しておきましょう」と述べています。

テストケースを変更して、コードから提示された「実際には間違っていない」という回答を受け入れるか、「今後の機能強化」のときが来たことを受け入れるようにします。したがって、次のステップは、Gemini Code Assist を使用してコードを修正し、テストで期待されるより適切な回答を得ることです。

6. コードを強化する

24XXIIII のようなレスポンスは、より一般的な XXIV ではなく、実際には「間違いではない」と見なされ、今後の機能強化が予定されていることを思い出してください。そういう未来は今なのです。「間違いではない」という答えは、やはり迷惑です。

ローマ数字で数字が繰り返される場合の 1 つ目のルールとして、同じ数字が 4 行に 1 行に 4 つの場合は、いずれか 1 つの数字の後に次に高い数字を続ける必要があります。そのため、XXIIIIXXIV に置き換える必要があります。同様に、XXXXXL に変更し、CCCCCD に変更します。

number_to_roman によって返される直前に、roman 変数の値をこのように変更する方法を Gemini コード アシストに質問します。

If the final value of roman has IIII in it, that should be replaced by IV. Similarly XXXX should be replaced by XL, and CCCC should become CD. How can I make those changes?

最後にコードを追加することをおすすめします。

6437c3fa2c5fabd1.png

これらの行をエディタにコピーして貼り付けるか、入力して、結果を確認します。

dcefa568cab82fb7.png

Gemini Code Assist では、最初の置換セットを行った後に発生する可能性のあるケースを処理するために、行がさらに追加されました。たとえば、19 は XVIIII、XVIV、最後に正しい XIX に変換されます。

Gemini Code Assist が有用と思われる提案を行っていた場合は、Tab キーを押して推奨事項を受け入れ、ファイルを保存し、ウェブサーバーを再度実行します。それ以外の場合は、この例に示されている行を手動で追加し、ファイルを保存します。難しい変換を試してみましょう: 1999 年:

a206999587fdc9.png

正解です。

今すぐテストを再実行します。すべて合格です!

ウェブ アプリケーションを本番環境に移行する準備が整いました。

7.Cloud Run にデプロイする

Cloud Run は、コンテナ化されたアプリケーションをインターネット上で実行します。Flash などの一般的なフレームワークを使用して記述されたアプリケーションの場合、gcloud run deploy コマンドを使用すると、コンテナをデプロイする前にビルドすることもできます。次のコマンドを実行します。

gcloud run deploy

ターミナルでソースコードの場所を求められたら、Enter キーを押して、表示された正しい場所を受け入れます。同様に、サービス名の入力を求められたら、Enter キーを押して候補を受け入れます。

gcloud は使用するプロジェクトを決定できないため、コマンドが失敗する可能性があります。その場合は、次のコマンドを実行します。

gcloud config set core/project <project-id>

ここで、 はプロジェクトの ID に置き換えられます。プロジェクトの名前と同じでもかまいません。次に、gcloud run deploy コマンドを再実行します。

  • このコマンドを実行すると、特定の API が必要であるのにまだ有効になっていないことが示されます。有効にするには、「y」と入力します。
  • リージョンを選択するように求められたら、ご都合の良いリージョンを選択します。us-central1 に対応する数値を入力することをおすすめします。
  • プロンプトが表示されたら、「Y」と入力して続行します。
  • この Cloud Run サービスの未認証の呼び出しを許可します。unauthenticatedCloud Run で使用される認証オプションは、サービスを呼び出すプログラムで使用するのに適しています。これはウェブサイトであるため、認証は使用しません。

Google Cloud がコンテナをビルドしてデプロイし、トラフィックのルーティングとアクセス ポリシーの設定を行った後、ホームページへのリンクを表示します。

94ba7d8d63a44afd.png

このリンクからアプリケーションにアクセスできます。

a2e51666dfd33a9f.png

数値を入力して Enter キーを押すだけで、

5021535ac991a95c.png

えっ!

お使いのマシンでは正常に機能しました。まだ終わっていないのはなぜですか?

ご確認ください。Gemini Code Assist に質問します

Why am I getting an internal server error on cloud run?

4b24321251d6eddf.png

Gemini Code Assist は同じような内容のログファイルを読み取ることができます。Gemini Code Assist に、自分でログを確認する方法について質問してみましょう。

92d1855be73ef1d.png

操作してください。次のように、エラーを示す赤色の !! 行を探します。

9bed4f9ed82de21c.png

その後に、コールスタックに関する多数の詳細行がここに表示されます。ただし、次のようになります。

47fc93be845f4e3f.png

calendar.py ファイルを見ると、そこに number_to_roman 関数があります。お使いのマシンでは正しく動作していたので、そのとおりです。Cloud Run ではどのような違いがあるでしょうか。

答えはやや困難です。Python3 には calendar という標準モジュールが用意されており、number_to_roman 関数が定義されている calendar.py ファイルと同様です。ローカルマシンで、Python は calendar というモジュールを検索する際、最初にアプリケーション ディレクトリを検索します。Cloud Run 上の Python は、最初に標準モジュールを探してインポートしましたが、number_to_roman 関数は見つかりませんでした。

このような環境の違いは、常に起こり得ます。幸いなことに、アプリケーションがコンテナ化されると、環境が内部に保持されるため、どこで実行しても同じ動作を期待できます。Cloud Run と同じコンテナ化されたアプリケーションをローカルで実行していたら、同じ問題に遭遇したでしょう。

この問題を解決します。ローカル カレンダー モジュールの名前を標準のモジュール名以外の名前に変更する必要があります。calendar.py ファイルの名前を my_calendar.py に変更し、main.pycalendar-unittest.pyimport calendar 行を import my_calendar に変更します。最後に、行を

roman = calendar.number_to_roman(number)

たとえば

roman = my_calendar.number_to_roman(number)

ローカルで試し、テストを実行してから再デプロイします。

gcloud run deploy

次のように機能します。

ed288801c6825eb1.png

この URL を共有すると、ローマ数字の変換ツールを必要とするすべてのユーザーが使用できます。

8. 省略可: 見栄えを良くする

アプリケーションは正常に実行されており、ウェブ上の誰でもアクセスできます。でも、少し見栄えが良いです。皆さまにお伝えする前に、Gemini Code Assist に外観の改善を依頼してみましょう。

templates/index.html ファイルを開きます。Gemini のチャット ウィンドウで、次のように質問します。

Make this index.html file use material design.

レスポンスでは、現在のファイルにファイルを追加します。結果は次のようになります。

<!DOCTYPE html>
<html>
<head>
    <title>Roman Numerals</title>
    <link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">   
    <script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>     
</head>
<body>
    <h1 class="mdl-typography--title">Roman Numerals</h1>
    <form action="/convert" method="post">
        <div class="mdl-textfield mdl-js-textfield">
            <input class="mdl-textfield__input" type="text" id="number" name="number" required />
            <label class="mdl-textfield__label" for="number">Enter a number:</label>
          </div>
          <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">
            Convert!
          </button>
    </form>
</body>
</html>

このアイコンを使用して、提案されたコードをコピーし、index.html の既存のコンテンツに貼り付けます。ターミナルで python3 main.py を実行し、リンクをクリックしてプレビュー ウィンドウを開きます。ページは少しシンプルになりました。

295643ec03fcaafc.png

必要に応じて、convert.html ファイルでこれを繰り返します。

Gemini Code Assist は CSS に精通しているため、さまざまな方法でアプリケーション ページのスタイルを設定できます。これは始まりにすぎません。

このアプリケーションを共有するため、忘れずに Cloud Run に再デプロイしてください。

gcloud run deploy

ローマ数字に変換する必要がある人に URL を渡すことができます。

9. 完了

おめでとうございます。Gemini Code Assist を使って、アプリケーションへのテストの追加、アプリケーションのエラーの修正、拡張機能の追加を行うことができました。

構築したアプリケーションの使用が終了したら、Cloud コンソールのダッシュボードから削除して、今後請求が発生しないようにすることができます。

リファレンス ドキュメント