開発過程で実際に機能する明快で効率的なユニットテストの書き方は重要です。ユニットテストは個々のコード要素を分離し、意図したように機能しているか確認します。
効果的なユニットテストはエラーを捕まえるだけでなく、コードが保守可能で信頼性があることを確信することができます。しかし、手動で幅広いユニットテストのスイートを作成するためには時間とリソースが必要です。
人工知能の最近の開発により、ユニットテスト開発プロセスの自動化を助けるものが出てきました。2月に、Metaの研究者たちは大規模な言語モデルを用いた自動ユニットテスト改善に関する論文を発表しました。これにより、LLMを使用して既存のユニットテストを分析し、コードカバレッジを増やすために改善する新しい方法が導入されました。
TestGen-LLMと呼ばれる新しいツールに注目します。これは、既存のユニットテストを分析し、改善し、コードカバレッジを増やすためにLLMの可能性を探るものです。
TestGen-LLMのコードが公开されていないため、この記事では彼らの研究をインスピレーションにとって开源の代替案を紹介します。その仕組みを理解し、どのようにテストスイートを生成するか、どのように最ものLLMを上回るのか、そしてこの技術を手に入れる方法を学ぶことができます。
目次
MetaのTestGen-LLM
MetaのTestGen-LLMは、大規模言語モデル(LLM)の力を利用して、ユニットテストの書き込みを時間のかかる作业を解決しています。GeminiやChatGPTなどの一般的なLLMは、ユニットテストコードの特定の領域やテストのスyntax、有効性のないテストの生成に苦労するかもしれません。しかし、TestGen-LLMはユニットテストに特化しています。
この専門性により、コード構造やテストロジックの複雑さを理解することができ、より指向的なテストスイートを生成し、有効なテストとして値を追加し、コードカバレッジを増やします。
TestGen-LLMは、训练された一般的なテストパターンの理解力を利用して、ユニットテストを評価し、改善の余地を見つけることができます。しかし、単にテストを生成するだけでは、適切なコードカバレッジを得るためです。
Metaの研究者たちは、TestGen-LLMに対して、書かれたテストの有効性を保証する保護機能を実装しました。これらの保護機能はフィルタ
と呼ばれ、品質管理手段として機能します。これらは以下のような提案を除外します。
-
コンパイルできない
-
一定に失敗する、または
-
実際にコードカバレッジを改善することがない(他のテストに既にカバーされている提案)。
TestGen-LLMはどのように機能するのか?
TestGen-LLMは「保証されたLLM基盤のソフトウェアエンジニアリング」と呼ばれる手法を使用しています。TestGen-LLMは既存のテストクラスに新しいテストケースを追加しますが、すべての既存のテストケースを保持しており、因此、リグレッションが起こらないことを保証します。
Test generation workflow(TestGen_LLM 論文から)
TestGen-LLMは、テストを生成し、それらを実行しないものや、通過しないもの、コードカバレッジを増やしないものをすべて除外します。
Metaは、TestGen-LLMを使用してテストスイートを自動化する後、人間のレビューアを通じて生成されたテストの受け入れ率を73%に記録した最良の報告の場合にテストの受け入れや却下を行いました。
論文によると、TestGen-LLMは開発者が以前に書いた既存のテストスイートに一度に1つのテストを生成します。しかし、テストスイートに対してテストを生成することは必ずしも行わない。
TestGen-LLMの効果性は、Metaの内部のテストアタックで示されました。ここで、ツールは既存のテストスイートを分析し、改善を提案しました。結果は期待に応じていました:
「TestGen-LLMのテストケースの75%が正しく構築され、57%が信頼性のあるまで通過し、25%がカバレッジを増やしました。MetaのInstagramとFacebookのテストアタックで、それが適用されたすべてのクラスの11.5%を改善し、Metaのソフトウェアエンジニアによる生産環境へのデプロイメントのための73%の推奨が受け入れられました」。
テストアースリーム(TestGen-LLM)の推奨は、テストアースリームで参加した開発者にとって有用で相关性があると認識されています。
オープンソース実装(Cover-Agent)
メタのTestGen-LLM研究は、コードに特化したLLMを利用した単体テストと自動テスト生成を変える大きな可能性を秘めています。このツールは、特にコードによるカバレッジの改善と、テスト作成のスピードアップを助けるでしょう。しかし、TestGen-LLMのコードがリリースされていないため、この技術を使用することは、谁でもできません。
この技術に興味を持つ開発者は、公然と利用可能なコードの欠如に耐えています。なぜなら、メタのTestGen-LLM研究は、自動テストの未来を見る一瞥を提供しているからです。
最新の技術の内部工作机制に深め込むこと、その決定プロセスを理解すること、およびおそらくその進化を形作ることが非常に魅力的です。しかし、メタのコードの欠如は機能の妨げとなりますが、Cover-Agent
というオープンソース実装が、有効な代替手段として利用できます。
CodiumAIのCover-Agent
は、TestGen-LLMベースの自動テストツールの最初のオープンソース実装であり、メタの研究に触発されたCover-Agentは、現在、オープンソースのAI駆動の単体テストの開発の最前線に位置しています。
特定のテスト Focused LLMはなぜ必要ですか?
ほとんどのLLM(如 ChatGPT Gemini)はテストを生成することができるので、新しい技術に挑戦する必要はありませんか?
以下が翻訳されたテキストです。
Cover-AgentとTestGen-LLMは、効率的なユニットテストの進化の次の段階として作成されました。
-
LLMの誤作動
-
価値のないテストの生成
-
一部のコードを省略しているため、低いコードカバレッジの生成
このような課題(特に回帰ユニットテスト)を克服するために、TestGen-LLMの研究者たちは生成されたテストが受け入れられる前に以下の基準を満たす必要があると考えました:
-
生成されたテストは正しくコンパイル・実行されますか?
-
テストはコードカバレッジを向上させますか?
-
価値を追加しますか?
-
追加の要件を満たしていますか?
これらは、生成されたテストが既存技術を上回るものとみなされる前に解決すべき基本の質問と問題です。Cover-Agentはこれらの質問に高い水準で答えを提供します。
Cover-Agentはどのように動作するのか?
Cover-Agentは、ソフトウェアプロジェクトのユニットテストの作成を自動化するために設計されたより广いスイッチのセットの一部です。TestGen-LLMの生成型AIモデルを利用して、テストプロセスを簡素化し、高速化し、高品質なソフトウェア開発を保証しようとしています。
このシステムはいくつかのコンポーネントで構成されています。
-
テスト実行器: テストスイートを実行し、コードカバレッジレポートを生成するためのコマンドやスクリプトを実行します。
-
カバレッジ解析器: テストが追加されると、コードカバレッジが増えることを確認し、新しいテストが全体的なテスト効果に貢献することを確認します。
-
プロンプト構築器: コードベースから必要なデータを集め、大規模言語モデル(LLM)に渡されるプロンプトを構築します。
-
AI呼出器: 提供されたプロンプトに基づいてテストを生成するためにLLMとやりとりします。
これらのコンポーネントはTestGen-LLMと一緒に動作し、既存のコードベースを改善することを保証するテストだけを生成します。
Cover-Agentの使用方法
要件
Cover-Agentを使用する前に以下の要件を満たす必要があります。
-
OPENAI_API_KEY
を環境変数に設定しておく必要があり、これはOpenAI API
を呼び出すために必要です。 -
コードカバレッジツール: Cobertura XML コードカバレッジレポートが必要で、ツールを正しく機能させるために使用されます。たとえば、Pythonでは
pytest-cov
を使用することができます。Pytestを実行する際に--cov-report=xml
オプションを追加してください。
インストール
Cover-Agentをリポジトリから直接実行している場合は、以下も必要です。
-
你的系统上安装了Python。
-
PoetryをインストールしてPythonのパッケージ依存性を管理します。Poetryのインストール方法はこちらにあります。
独立 runtime
You can install Cover-Agent as a Python Pip package or run it as a standalone executable.
Python Pip
Cover-AgentをPython Pipパッケージとしてインストールするか、スタンドアロンの実行可能ファイルとして実行できます。
pip install git+https://github.com/Codium-ai/cover-agent.git
バイナリ
Python環境を持たないシステム上でバイナリを実行することもできます(たとえばPythonを含まないDockerコンテナ内で)。プロジェクトのリリースページに行き、システムに合わせたリリースをダウンロードします。
リポジトリのセットアップ
以下のコマンドを実行して、すべての依存関係をインストールし、ソースからプロジェクトを実行します:
poetry install
コードの実行
実行可能ファイルをダウンロードするか、Pipパッケージをインストールした後、Cover-Agentを実行してユニットテストを生成および検証できます。
以下のコマンドを使用して、コマンドラインから実行します:
cover-agent \
--source-file-path "path_to_source_file" \
--test-file-path "path_to_test_file" \
--code-coverage-report-path "path_to_coverage_report.xml" \
--test-command "test_command_to_run" \
--test-command-dir "directory_to_run_test_command/" \
--coverage-type "type_of_coverage_report" \
--desired-coverage "desired_coverage_between_0_and_100" \
--max-iterations "max_number_of_llm_iterations" \
--included-files "<optional_list_of_files_to_include>"
このリポジトリ内の例題プロジェクトを使用して、このコードをテストとして実行することができます。
コマンド引数
-
source-file-path: テストしたい関数やコードブロックを含むファイルのパスです。
-
test-file-path: テストがエージェントによって書かれるファイルのパスです。このファイルには、少なくとも1つのテストと必要なimport文を含むスケルトンを作成するのがベストです。
-
コードカバレッジレポートパス: コードカバレッジレポートを保存するパス。
-
テストコマンド: テストを実行するコマンド(例:pytest)。
-
テストコマンドディレクトリ: テストコマンドを実行するディレクトリ。これをルートまたは主要なファイルの位置に設定して、相対的なインポートに問題が生じないようにする。
-
カバレッジタイプ: 使用するカバレッジのタイプ。CoberturaはDefaultとして良い选择です。
-
望まれるカバレッジ: カバレッジの目標。より高いほど良いが、100%は往往実践的ではない。
-
最大反復: エージェントがテストコードを生成するために再試行する次数。反復を増やすとOpenAIトークンの使用が多くなる可能性があります。
- 追加指示:コードが特定の方法で書かれることを保証するプロンプト。たとえば、ここではコードがテストクラス内で機能するように整形されるべきであることを指定しています。
コマンドを実行すると、エージェントはテストを書き込み、反復し始めます。
Cover-Agentの使用方法
Cover-Agentを試す時が来ました。簡単なcalculator.pyアプリを使用して、手動テストと自動テストのコードカバレッジを比較しましょう。
手動テスト
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
これはtest_calculator.pyという名前のファイルで、testフォルダーに置かれています。
# tests/test_calculator.py
from calculator import add, subtract, multiply, divide
class TestCalculator:
def test_add(self):
assert add(2, 3) == 5
テストカバレッジを見るためには、前述のコードカバレッジ報告のためのpytestの拡張としてpytest-cov
をインストールする必要があります。
pip install pytest-cov
次のようにカバレッジ分析を実行します。
pytest --cov=calculator
出力は以下のようになります。
Name Stmts Miss Cover
-----------------------------------
calculator.py 10 5 50%
-----------------------------------
TOTAL 10 5 50%
上の出力は、calculator.pyの10のステートメントのうち5つが実行されていないことを示しており、たった50%のコードカバレッジしかありません。より大きなコードベースでは、これは深刻な問題となり、遅れを招くでしょう。
では、CodiumのCover-Agentでより良い結果が出るか試してみましょう。
Cover-Agentを使用した自動テスト
CodiumのCover-Agentを設定するには、以下の手順に従います。
まず、Cover-Agentをインストールします。
pip install git+https://github.com/Codium-ai/cover-agent.git
OPENAI_API_KEYを環境変数に設定していることを確認してください。OpenAI APIにはこれが必要です。
次に、テストを生成するコマンドをテーマで書いてください。
cover-agent \
--source-file-path "calculator.py" \
--test-file-path "tests/test_calculator.py" \
--code-coverage-report-path "coverage.xml" \
--test-command "pytest --cov=. --cov-report=xml --cov-report=term" \
--test-command-dir "./" \
--coverage-type "cobertura" \
--desired-coverage 80 \
--max-iterations 3 \
--openai-model "gpt-4o" \
--additional-instructions "Since I am using a test class, each line of code (including the first line) needs to be prepended with 4 whitespaces. This is extremely important to ensure that every line returned contains that 4 whitespace indent; otherwise, my code will not run."
これにより以下のコードが生成されます。
import pytest
from calculator import add, subtract, multiply, divide
class TestCalculator:
def test_add(self):
assert(add(2, 3), 5
def test_subtract(self):
"""
Test subtracting two numbers.
"""
assert subtract(5, 3) == 2
assert subtract(3, 5) == -2
def test_multiply(self):
"""
Test multiplying two numbers.
"""
assert multiply(2, 3) == 6
assert multiply(-2, 3) == -6
assert multiply(2, -3) == -6
assert multiply(-2, -3) == 6
def test_divide(self):
"""
Test dividing two numbers.
"""
assert divide(6, 3) == 2
assert divide(-6, 3) == -2
assert divide(6, -3) == -2
assert divide(-6, -3) == 2
def test_divide_by_zero(self):
"""
Test dividing by zero, should raise ValueError.
"""
with pytest.raises(ValueError, match="Cannot divide by zero"):
divide(5, 0)
エージェントがまた、エッジケースについてのテストを書いていることがわかります。
次に、再びカバレッジをテストします。
pytest --cov=calculator
出力:
Name Stmts Miss Cover
-----------------------------------
calculator.py 10 0 100%
-----------------------------------
TOTAL 10 0 100%
この例では、100%のコードカバレッジを達成しました。より大きなコードベースにとっては、手順はほぼ同じです。このガイドを読んで、大きなコードベースについての詳細な手順を学びます。
Cover-Agentは重要な段階を踏んだものですが、この技術はまだ研究ステージです。研究と開発の継続的な努力は、よりよい機能と幅広いアプリケーションへの取り組みを促進する所存です。codiumAIは、このオープンソースのツールに貢献していただくことを招待しています。
Open Source Cover-Agentの利点
Cover-Agentのオープンソース性には、技術の進歩を促進するいくつかの利点があります。その中には、以下が含まれます。
-
アクセス可能性:オープンソースの性質で、LLMに基づくテスト実験を行い、様々な背景の開発者によるアクセスが可能です。これにより、用户数を増やし、より良い技術の開発とより多くのアプリケーションの開発に繋がります。
-
協力: 開発者は、貢献をしたり、改善提案をしたり、新しい機能を提案したり、問題報告をしたりすることができます。Cover-Agentは、開発者に最適なプロジェクトに成長し、迅速に開発されます。
-
透明性: 内部の運用の情報が公開されており、これにより信頼を促進し、技術の可能性を最終的に増やします。
また、オープンソースの利点に加えて、Cover-Agentは開発者に独自の強力な利点を提供します:
-
簡単なアクセス: 開発者はLLMに基づくテストに簡単にインストールし、実験することができます。これにより、技術の能力を直接と迅速に探索することができ、 workflowに多大な影響を与えないでしょう。
-
特定の需要に合わせたカスタマイズ: Cover-Agentのオープンソース性により、開発者はツールを自分のプロジェクトの要求に合わせて適切に適用することができます。これには、使用するLLMモデルを変更し、学習データを自分のコードベースを更好地に反映するために調整すること、またはCover-Agentを既存のテストフレームワークと統合することが含まれます。このようなレベルのカスタマイズにより、開発者はLLMベースのテストのパワーを自分のプロジェクトの需要に合わせて活用することができます。
-
簡単な統合: VSCode(人気のコードエディタ)に簡単に統合できますので、既存の workflowとの統合は簡単です。既存の人間の書いたテストとも簡単に統合できます。
あなたはCover-Agentにどのように貢献することができるでしょうか?
Cover-AgentのソースコードはGitHubのこのリポジトリから公に入手可能です。彼らは、すべての背景の開発者が彼らの製品をテストし、この新しい技術のさらなる改善と成長に貢献するように励ましています。
結論
LLM(大規模言語モデル)に基づくテスト改善ツールは、開発者がユニットテストを取り組む方法を革命的に変える巨大な可能性を秘めています。大規模言語モデルを利用し、コードに特化して訓練されたモデルを使うことで、テストの作成を流暢化し、コードのカバレッジを向上させ、最終的にはソフトウェアの品質を向上させることができます。
MetaのTestGen-LLMに基づく研究は重要な洞察を提供していますが、公に利用可能なコードの缺如が较广な采用と進行の妨げとなっています。幸いにも、Cover-Agentはすぐにアクセス可能でカスタマイズ可能な解決策を提供しています。これは開発者にLLMに基づくテストを実験し、その進化に貢献する力を与えます。
TestGen-LLMとCover-Agentの可能性は巨大で、開発者の貢献によるさらなる開発は、自動テスト生成を変身させる革命的なツールになるへの道を開くでしょう。
Source:
https://www.freecodecamp.org/news/automated-unit-testing-with-testgen-llm-and-cover-agent/