ご存知のとおり、作業を始めたばかりのコードベースを見て、それが広大な未知の荒野であることに気づくと、ある種の不安が忍び寄ってきます。予期せぬ事態を防ぐために書かれたテストは 1 つもありません。
それは、一歩間違えばプロジェクト全体が混乱に陥る可能性があることを知りながら、溝の上を綱渡りしているようなものです。
テストが 0 件あるコードベースで作業したことがある場合は、現在テストが存在しないコードベース全体をゼロからテストでカバーすることを考えるのは、気が遠くなる作業であることがわかります。
このプロセスには、ほとんど大変な労力が必要です。すべての関数、メソッド、コンポーネントをすべて検討し、潜在的なエッジ ケースをすべてブレインストーミングし、テスト スイートのコードを構造化し、すべてをスムーズに実行する必要があります。
そしてそれは、有意義な報道に到達するまでにかかる時間にも触れていません。皆さんが座って「はい、カバー率が 80% か 90% に達しました」と言えるようになるまで、数週間、場合によっては数か月もかかるでしょう。
だからこそ、ここ数か月間私が取り組んできたことを共有できることに興奮しています。この旅は、自動テストの領域と AI の魔法の世界が出会う場所に私たちを導きます。 Pythagora は、あなたの新しい親友になるオープンソース開発ツールです。
このブログ投稿では、 Pythagora を使用して自動テストを開始する方法を説明します。Pythagora は、AI の力を利用してコードベース全体のテストを1 つの CLI コマンドで生成し、できればコードベースのテストを 80% ~ 90% に到達させることができます。 1 日のコード カバレッジの割合。
「ローマは一日にして成らず」という格言は誰もが知っています。包括的で効果的なテスト スイートについても同じことが言えます。細心の注意を要する厳しいプロセスですが、この険しい道を乗り越えた後の達成感は格別です。
テスト スイートをゼロから作成し、誰もが望む 80% ~ 90% のコード カバレッジに到達するために必要な手順を一緒に見ていきましょう。
最初の段階では、あなたは真っ白なキャンバスの前にいる画家のようなものです。世界は可能性に満ちており、傑作を自由に作成できます。
この場合、傑作には、作成するテストの種類を選択し、使用する適切なテスト フレームワークを見つけて、特定の環境に適したベスト プラクティスを採用することが含まれます。
単体テスト、統合テスト、E2E テスト、または 3 つすべての組み合わせを検討していますか?
この初期セットアップは「簡単」な部分とみなされがちですが、決して簡単な作業ではありません。情報に基づいた決定を下すには、時間、調査、そしておそらく数杯のコーヒーが必要です。
基本的な構造を整えたら、腕をまくって核心を掘り下げてみましょう。次に、コードベース全体を一度に 1 つの関数ずつ調べて、それぞれの関数のテストを作成する必要があります。ここでのタスクは、テストが各関数、メソッド、またはコンポーネント内のコードのすべての行に影響を与えることを確認することです。
このタスクは、複雑な迷宮を探索するようなものです。すべての道を横断し、すべての角を曲がり、石が取り残されていないことを確認する必要があります。
これらのテストの作成は詳細で時間のかかる手順です。単に数行のコードを書くだけではありません。関数の目的、期待される出力、アプリケーション内で関数がどのように相互作用するかを理解することが重要です。
最初のテストが終わったら、安堵のため息をつくかもしれません。でもちょっと待ってください。パズルの重要なピースがまだ残っています。エッジケースのワイルドで予測不可能な世界に飛び込む時が来ました。
この部分ではコード カバレッジ パーセンテージが向上しない可能性がありますが、コードの堅牢性と復元力をテストする場合には重要です。
これらのいわゆるネガティブ テストは、さまざまな入力、特に予期される動作の周辺にある入力に対してコードがどのように反応するかを評価するのに役立ちます。空の入力からデータ型の限界を押し上げる値まで、これらのテストは現実世界のユーザーの動作を模倣するように設計されており、ユーザーは多くの場合、不可能だと思わない方向にコードをプッシュするコツを知っています。
テスト スイートを最初から作成するのは大変な作業です。ただし、すべての努力は、より堅牢で信頼性が高く、回復力のあるアプリケーションを作成するための一歩ですので、ご安心ください。
そして、あなたは一人ではないことを忘れないでください。誰もがそこに行ったことがあるでしょう。ピタゴラのようなツールを使えば、その旅は思っているほど難しくありません。
一方、Pythagora では、次のように入力できます。
npx pythagora --unit-tests --path ./path/to/repo
Pythagora は、すべてのフォルダー内のすべてのファイルをナビゲートし、検出した関数ごとに単体テストを呼び出します。ここで、座ってリラックスしたり、昼食をとりに行ったりして、テストの作成が完了するまでしばらく実行させておくことができます。
さて、でも待ってください、ピタゴラとは一体何ですか??
私は、自動テストが作成できる世界を常に夢見てきました。しかし、現実はそれほど単純ではありません。あなたほどあなたのコードを知っている人はいないため、他の人がそのコードの効果的な自動テストを作成するのは困難です。結果は、自分自身で達成できるものを下回ることがよくあります。
しかし、ChatGPT が登場するとすべてが変わりました。このテクノロジーをいじくり回しているうちに、「自動テストを作成するために ChatGPT の力を活用できないだろうか?」と疑問に思うようになりました。
好奇心がそそられ、さらに深く調べてその機能を実験してみたところ、発見したものに衝撃を受けました。
ChatGPT はコードを理解する驚異的な能力を実証し、自動テストにおける有望な新しい道を垣間見せました。
こうして、ピタゴラのアイデアが生まれました。
Pythagora は、自動テストを自律的に行うという1 つの使命を念頭に置いて作成されたオープンソースの開発ツールです。私は、あなたや私のような開発者が、テスト作成やメンテナンスの泥沼にはまることなく、機能の作成に集中できる世界を思い描いています。
このビジョンを達成するために、GPT-4 を使用しています。
現在、Pythagora には単体テストと統合テストの両方を作成する能力があります。ただし、このブログ投稿では、単体テストを生成する機能に焦点を当てます。
Pythagora をインストールするには、 npm i pythagora
を実行するだけです。それでおしまい!ピタゴラがあなたのお手伝いをします。
Pythagora をインストールしたら、API キーを使用して構成する必要があります。これは、OpenAI API キーまたは Pythagora API キーのいずれかです。
OpenAI API キーを使用するには、次のコマンドを実行する必要があります。
npx pythagora --config --openai-api-key <OPENAI_API_KEY>
独自の OpenAI API キーを使用する場合は、GPT-4 にアクセスできる必要があることに注意してください。
あるいは、このリンクから Pythagora API キーを取得できます。入手したら、次のコマンドで設定します。
npx pythagora --config --pythagora-api-key <PYTHAGORA_API_KEY>
特定のファイルのテストを生成したい場合は、以下を使用します。
npx pythagora --unit-tests --path ./path/to/file.js
特定の関数を念頭に置いている場合は、次を使用します。
npx pythagora --unit-tests --func <FUNCTION_NAME>
カーテンを剥がしてエンジンルームを覗いてみましょう。何がピタゴラを動かしているのでしょうか?
Pythagora の核心は、コードベースの複雑な迷路を探索する勇敢な探検家として機能します。まず、ファイルからエクスポートされたすべての関数をマップして、テスト内から関数を呼び出せるようにします。
明らかに、関数がエクスポートされていない場合、そのファイルの外部から関数を呼び出すことはできません。ところで、テストを数回生成すると、コードベースについて考え、より多くのテストを生成できるようにコードベースをより適切に構造化するにはどうすればよいかを考えるようになります。
エクスポートされた関数を特定すると、Pythagora はウサギの穴にさらに一歩踏み込みます。各関数を順番に調査し、内部で呼び出される追加関数を探し出します。
コードベースの考古学者が、埃の層をそっと払い落として、隠れた接続や依存関係を明らかにするようなものだと想像してください。
言い換えれば、テスト対象の関数内から呼び出されるすべての関数を検索して、 GPT がテストの作成対象となっている関数が何を行うのかをよりよく理解できるようにします。
この情報を武器にして、ピタゴラは AI の力を利用する準備をします。収集したコードをパッケージ化し、Pythagora API にディスパッチします。ここで、実際の魔法が起こります。プロンプトが細心の注意を払って作成され、GPT モデルに渡されます。
コード、API、および AI モデルの間のこの相互作用により、デプロイして機能させる準備ができた包括的な単体テストのセットが生成されます。
API サーバーと使用されるプロンプトは両方ともオープンソースです。これらは、必要に応じて詳しく調べたり、精査したり、貢献したりするために利用できます。 Pythagora API サーバーはここにあり、単体テストの作成におけるプロンプトと主要な要素はこのフォルダーに格納されています。
Pythagora が要求されたすべてのテストを作成したら、すぐにテストを開始してレビューを開始します。これはプロセスにおける重要なステップです。何が作成されたのかを知り、すべてが期待どおりであることを確認することが重要です。
Pythagora は Jest ベースのテストを作成することを思い出してください。したがって、生成されたすべてのテストを実行するには、次のコマンドを実行するだけです。
npx jest ./pythagora_tests/
ここで注意が必要ですが、Pythagora はまだ初期段階にあります。すべての若いプロジェクトと同様、途中で問題が発生することは避けられません。そのため、最初の実行でテストが失敗する可能性があります。
落胆しないでください。これも旅の一部だと考えてください。あなたのレビューと Pythagora の継続的な改善により、これらの失敗したテストは間もなく過去のものになるでしょう。
そして明るい面も忘れてはいけません。このような初期段階の歯が生える問題があっても、Pythagora を使用すると、コードベースのテスト カバレッジが実質的に (最大90% に達する可能性があります)になるところまで到達できます。
レビュー プロセスには、特に大規模なコードベースの場合、数時間かかる場合があります。合格したテストだけでなく、失敗したテストも確認していることに注意してください。リポジトリにコミットしているすべてのテストを理解することが重要です。結局のところ、知識は力です。
徹底的なレビューと潜在的な調整を経て、生成されたテストをリポジトリにコミットするという最終段階に進む準備が整いました。この最後のステップで、堅牢な単体テスト スイートをプロジェクトに統合することができます。
これらすべては、Pythagora の機能とターミナルでの数行のコマンドによって実現されます。
さて、興味をそそられたので、実際の内容、つまり実際に動作するピタゴラの具体的な例を詳しく見てみましょう。デモの目的として、有名なオープンソース プロジェクトLodashを選択しました。
たった 1 つの Pythagora コマンドを実行するだけで、なんと 1604 件のテストが生成され、Lodash リポジトリ全体の 91% という驚異的なコード カバレッジを達成しました。しかし、素晴らしいのはテストの量だけではありません。
これらのうち、 13 のテストで Lodash マスター ブランチ内の実際のバグが発見されました。
これらを自分で確認したい場合は、Lodash リポジトリをフォークし、Pythagora によって生成されたテストを追加しました。ここで自由に調べてみてください。
ここで、卑劣なバグを発見したテストの 1 つを詳しく見てみましょう。
test(`size({ 'a': 1, 'b': 2, 'length': 9 })`, () => { expect(size({ 'a': 1, 'b': 2, 'length': 9 })).toBe(3); // test returns 9 });
このテストでは、Lodash のsize
関数は JSON オブジェクトのサイズを返すことになっています。ただし、GPT はlength
という名前のキーを追加しました。これは、Lodash がオブジェクトの実際のサイズの代わりにそのキーの値を返すかどうかを確認するためのちょっとしたトリックです。
テストは予想される「3」ではなく「9」を返して失敗したため、Lodash はこの策略にはまったようです。
これは、GPT を利用した Pythagora が、レーダーをすり抜けやすいトリッキーなエッジ ケースを明らかにすることに優れていることを示す素晴らしい例です。
このような複雑なテスト ケースを多数自動的に生成することで、Pythagora は信頼できる相棒となり、予期せぬバグの発見と修正を支援します。
開発者の皆さん、これで終わりです。私たちは今日、かなり長い旅に乗り出し、テストのない大部分のコードベースという未知の領域を横断し、信頼できる AI を活用したツールである Pythagora によって作成された自動テスト スイートを携えて戻ってきました。
テストのない困難なコードベースに直面しても、絶望する必要はないことを学びました。実質的なテスト スイートを作成するという作業は、もはや困難な作業である必要はありません。
私たちは、Pythagora が有名なオープンソース ライブラリである Lodash を調べ、コードベースの驚くべき 91% をカバーする1604 のテストを生成したときの魔法を目の当たりにしてきました。
ピタゴラがテストの量だけでなく質も重視していることが分かりました。単に目的のためにテストを作成するのではなく、気づかれずにすり抜けてしまったかもしれないエッジケースやバグをインテリジェントに発見します。
ピタゴラは、Lodash マスター ブランチ内の 13 個の実際のバグを明らかにしました。これは、ソフトウェア テストにおける AI の力の証です。
これで、Pythagora のような AI を活用したテスト ツールが単なる贅沢品ではなく、今日のペースの速い開発環境において必需品である理由がより明確に理解できるはずです。
したがって、テストがゼロの既存のプロジェクトに取り組んでいる場合でも、新しいプロジェクトを開始して最初から強固なテスト フレームワークを確立しようとしている場合でも、あなたは一人ではないことを忘れないでください。
Pythagora が手綱を引き、有意義なテストを簡単に生成できるように支援し、貴重な時間を節約し、優れた機能の開発に有効に費やすことができます。
この旅にご参加いただきありがとうございます。皆さんがプロジェクトで Pythagora をどのように活用するかを見るのが待ちきれません。コーディングを楽しんでください!
PS この投稿が役に立ったと思われた場合は、 Pythagora Github リポジトリにスターを付けていただければ、私にとって非常に意味のあることです。また、Pythagora を試してみた場合は、どうだったかを[email protected]までお知らせください。