Verdent Docs
タスク別ガイド

テストとデバッグ

Verdent によるテストとデバッグのワークフロー

Verdent for VS Code は、マルチパスの生成・テスト・修復サイクル、エラー分析、自動的なテストカバレッジの改善を通じて、包括的なテストの作成と問題のデバッグを支援します。プロジェクトのテストフレームワークやスタイルに合わせて、ユニットテスト、統合テスト、エンドツーエンドテストを生成します。

このページで学べること

  • エッジケースと期待される動作を網羅するユニットテストの生成
  • 主要なすべてのテストフレームワーク(Jest、Pytest、JUnit など)への対応
  • 複数コンポーネントにまたがるワークフローを検証する統合テストの作成
  • 未カバーのコードパスを特定してテストし、テストカバレッジを改善
  • エラーメッセージ分析と実行トレースによる問題のデバッグ
  • スタックトレース、エラーログ、予期しない動作からのバグ診断

前提条件

Verdent でテストやデバッグを行う前に、以下を確認してください。

  • Verdent 拡張機能をインストールした Visual Studio Code
  • VS Code で開いたコードベースまたはプロジェクトワークスペース
  • 利用可能なクレジットがある有効な Verdent サブスクリプション
  • プロジェクトに設定されたテストフレームワーク(テスト生成では任意)

ユニットテストの作成

Verdent は、プロジェクトのテストフレームワークやスタイルに合わせてユニットテストを生成します。既存のテストを分析してパターンを把握し、適切なセットアップ、アサーション、モックを備えたテストを生成します。

例:

Write unit tests for the calculateDiscount function

Verdent は次の処理を行います。

  • calculateDiscount 関数の実装を調査
  • 入力パラメータと戻り値を特定
  • 既存のテストを分析して規約(テスト構造、アサーションスタイル、命名パターン)に合わせる
  • 次を網羅するテストを生成:
    • 正常系: 期待される出力を持つ有効な入力
    • エッジケース: 境界値、ゼロ、負の数、最大値
    • 無効な入力: null、undefined、誤った型
    • 期待される動作: ビジネスロジックの検証

生成されるテストの構造:

Verdent は、プロジェクトのパターンに従ってテストを作成します。

  • テストスイートの構成: describe ブロック、テストクラス、またはモジュール構造
  • セットアップとティアダウン: 既存のテストに合わせた before/after フック
  • アサーション: プロジェクトのアサーションライブラリ(expect、assert、should など)を使用
  • モック: プロジェクトのモックパターン(jest.mock、sinon、unittest.mock)に合わせる
  • 命名規約: 確立されたスタイルに従ったテスト名

マルチパスの生成・テスト・修復サイクル:

包括的なテストのために、Verdent はマルチパスサイクルを使用します。

  1. 生成: 初期テストスイートを作成
  2. 実行: テストを実行して動作を検証
  3. 修復: 失敗するテストを修正、またはカバレッジを改善
  4. 反復: テストが成功しカバレッジが十分になるまで繰り返す

これにより、テストは単に書かれるだけでなく、実際にコードベースで正しく動作することが保証されます。

Verdent は既存のテストを分析して規約に合わせます。既存のテストパターンの一貫性が高いほど、Verdent が生成するテストはプロジェクトのスタイルによく合致します。


対応するテストフレームワーク

Verdent は、さまざまなプログラミング言語や技術スタックにわたる主要なテストフレームワークすべてに、追加設定なしで対応します。

ユニットテストフレームワーク:

test('sum returns correct result', () => {
  expect(sum(2, 3)).toBe(5);
});
const assert = require('assert');

describe('sum', () => {
  it('returns correct result', () => {
    assert.strictEqual(sum(2, 3), 5);
  });
});
import { describe, it, expect } from 'vitest';

it('sum returns correct result', () => {
  expect(sum(2, 3)).toBe(5);
});
describe('sum', () => {
  it('returns correct result', () => {
    expect(sum(2, 3)).toEqual(5);
  });
});

フレームワーク固有のテスト:

  • React Testing Library - ユーザー視点の React コンポーネントテスト
  • Vue Test Utils - Vue.js の公式テストライブラリ

エンドツーエンドテスト:

  • Cypress - エンドツーエンドおよびコンポーネントテスト
  • Playwright - クロスブラウザのエンドツーエンドテスト
  • Puppeteer - ヘッドレス Chrome テスト
  • Pytest - 最も普及している Python テストフレームワーク
  • unittest - Python の組み込みテストフレームワーク
  • nose2 - unittest をプラグインで拡張
  • doctest - docstring に埋め込まれたテスト

Verdent は、Python のテストスタイルに合わせた適切なフィクスチャ、パラメータ化、アサーションパターンでテストを生成します。

  • JUnit - 標準的な Java テストフレームワーク(JUnit 4、JUnit 5)
  • TestNG - 高度な機能を備えたテストフレームワーク
  • Mockito - Java 向けモックフレームワーク
  • AssertJ - 流暢なアサーションライブラリ

Verdent は、Java のテスト規約に従ったアノテーション、ライフサイクルメソッド、アサーションを備えたテストを作成します。

  • RSpec(Ruby)- ビヘイビア駆動開発フレームワーク
  • PHPUnit(PHP)- PHP 向けユニットテストフレームワーク
  • Go testing(Go)- Go の組み込みテストパッケージ
  • xUnit(C#/.NET)- .NET 向けテストフレームワーク
  • Catch2(C++)- モダンな C++ テストフレームワーク

Verdent は、その言語のテスト慣習に適応し、プロジェクトの規約に合ったテストを生成します。

Verdent は、プロジェクトの設定や既存のテストからテストフレームワークを認識し、セットアップに合ったテストを自動的に生成します。


統合テストの生成

Verdent は、複数のコンポーネント、サービス、モジュールがどのように連携して動作するかを検証する統合テストを生成します。API とのやり取り、データベース操作、認証フロー、複数ステップのユーザージャーニーなど、実際のワークフローをシミュレートするテストを作成します。

例:

Write integration tests for the user registration flow

Verdent は、フロー全体を検証するテストを生成します。

  1. フォーム送信: ユーザーが有効なデータで登録フォームを送信
  2. 検証: バックエンドがメール形式、パスワード強度、データの完全性を検証
  3. データベース挿入: ユーザーレコードがデータベースに作成される
  4. メール送信: 確認メールが送信される(モックまたは実際の送信)
  5. ログイン成功: 新規ユーザーが認証情報ですぐにログインできる

統合テストの構造:

Verdent は、次の要素を備えた統合テストを作成します。

  • テストセットアップ: データベースのシード、サービスの初期化、テストデータの作成
  • ワークフローのシミュレーション: 複数ステップの操作を順番に実行
  • 状態の検証: データベース状態、API レスポンス、副作用の確認
  • 外部サービスのモック: メールサービス、決済 API、サードパーティ連携
  • テストのティアダウン: テストデータのクリーンアップ、データベースのロールバック、サービスのシャットダウン

テストシナリオの例:

Write integration tests for the checkout and payment process

Verdent がテストする内容:

  • カートへの商品追加
  • 割引コードの適用
  • 税金と送料を含む合計金額の計算
  • 決済処理(モック化された決済ゲートウェイを使用)
  • データベースへの注文レコードの作成
  • 確認メールの送信
  • 在庫の更新

テストの分離:

Verdent は、統合テストが適切に分離されていることを保証します。

  • 各テストはクリーンなデータベース状態から開始
  • 外部サービス呼び出しはモック化され、副作用を防止
  • テストは依存関係なしで任意の順序で実行可能
  • テストが失敗してもクリーンアップが行われる

統合テストは分離されたテスト環境から恩恵を受けます。Verdent はデータベースフィクスチャのセットアップや外部サービスのモック化を支援できます。

統合テストは、コンポーネントが正しく連携することを検証します。ユニットテストより複雑ですが、実世界のワークフローが期待どおりに機能するという高い信頼性をもたらします。


テストカバレッジの改善

Verdent は、コードベースを分析して未テストの関数、分岐、エッジケースを特定し、カバレッジを改善するテストを生成します。既存のテストスイートを調査し、コードパスが実行されていないギャップを見つけます。

例:

Analyze test coverage and write tests for uncovered code paths in the payment module

Verdent は次の処理を行います。

  1. 既存テストの分析: 現在何がテストされているかを調査
  2. カバレッジギャップの特定: テストが不足している特定の関数、条件分岐、エラー処理パス、エッジケースを発見
  3. 不足テストの生成: 未カバーのコードを対象とするテストを作成
  4. カバレッジ改善の検証: テストを実行してカバレッジが向上したことを確認

Verdent が特定する対象:

  • 未テストの関数: テストカバレッジがまったくない関数
  • 条件分岐: 一方の分岐がテストされていない if/else 文
  • エラー処理パス: 失敗時のテストがない try/catch ブロックやエラーコールバック
  • エッジケース: 境界値、null/undefined の処理、型変換
  • 統合ポイント: API 呼び出し、データベース操作、外部サービスとのやり取り

カバレッジ改善の例:

Improve test coverage for the UserService class

Verdent が特定する内容:

  • getUserById は有効な ID のテストはあるが無効な ID のテストがない
  • updateUser は検証失敗のテストが不足
  • deleteUser は認可チェックのテストが不足
  • createUser のエラー処理パスが未テスト

そのうえで、これらのギャップを狙ったテストを生成し、カバレッジを 65% から 95% に向上させます。

カバレッジ指標:

Verdent は、より高いカバレッジ率の達成と、これまで未テストだったコードに潜む潜在的なバグの発見を支援します。

  • 行カバレッジ: テストで実行されたコード行の割合
  • 分岐カバレッジ: テストされた条件分岐の割合
  • 関数カバレッジ: 少なくとも 1 つのテストがある関数の割合
  • ステートメントカバレッジ: 実行されたステートメントの割合

Verdent によるデバッグ

Verdent は、エラーメッセージの分析、実行フローのトレース、根本原因の特定、修正案の提示によってデバッグを支援します。エラーログを貼り付けたり、予期しない動作を説明したり、特定の問題の調査を Verdent に依頼したりできます。

何が間違っていて、何を期待していたかを説明します。

This function returns undefined instead of the user object. Debug it.

Verdent は次の処理を行います。

  • 関数の実装を読み取る
  • 実行フローをトレース
  • コードパスが誤動作する箇所を特定(return 文の欠落、不正な条件、async/await の問題)
  • 説明付きで修正案を提示
  • 回帰を防ぐためのテストケースを提案

例:

The login form redirects to the home page even when credentials are invalid

Verdent は次の処理を行います。

  • ログインフォーム送信のロジックを調査
  • 認証フローをトレース
  • バグを特定(非同期検証の完了前にリダイレクトが発生)
  • 修正案を提示(リダイレクト前に検証を await する)

パフォーマンス分析を依頼します。

The product search is slow when the database has 10,000+ products

Verdent は次の処理を行います。

  • 検索クエリの実装を分析
  • 非効率な箇所を特定(N+1 クエリ、データベースインデックスの欠落、非効率なアルゴリズム)
  • 最適化を提案(データベースインデックスの追加、クエリのバッチ化、結果のキャッシュ)

パフォーマンスデバッグは、アプリケーションを遅くするアルゴリズム、データベースクエリ、API レスポンスのボトルネックを特定するのに役立ちます。

コードがどのように実行されるかを理解します。

Why does this API endpoint return a 500 error when the email parameter is missing?

Verdent は次の処理を行います。

  • エンドポイントから検証、データベースへのリクエスト処理をトレース
  • エラーが発生する箇所を特定(undefined のプロパティへのアクセス)
  • エラーが発生する理由を説明(プロパティアクセス前の null チェックの欠落)
  • 防御的な修正を提案(使用前にパラメータを検証)

実行フローのトレースは、コードがたどる経路と、期待される動作から逸脱する箇所を理解するのに役立ちます。

エラーメッセージやスタックトレースをチャットに直接貼り付けてください。Verdent はエラーを分析し、問題のあるコードを特定して、具体的なファイルパスと行番号とともに何が問題かを説明します。


エラーメッセージとログからの診断

エラーメッセージ、スタックトレース、ログファイルをチャットに直接貼り付けてください。Verdent はエラーを分析し、ソースファイルと行番号を特定し、原因を説明して修正案を提示します。

エラーメッセージとスタックトレースを貼り付けます。

TypeError: Cannot read property 'name' of undefined
    at UserProfile.render (UserProfile.jsx:45)
    at processComponent (react-dom.js:2103)

これを Verdent に貼り付けます。

I'm getting this error: [paste stack trace]

Verdent は次の処理を行います。

  • エラーの種類を特定(null/undefined アクセスによる TypeError)
  • 正確な行を特定(UserProfile.jsx:45
  • その箇所のコードを読み取る
  • 発生理由を説明(データ読み込み前は user オブジェクトが undefined)
  • 修正案を提示:
    • null チェックを追加:if (!user) return <Loading />
    • オプショナルチェーンを使用:user?.name
    • コンポーネントのレンダリング前にデータを確実に読み込む

分析のためにログファイルやコンソール出力を貼り付けます。

Analyze these logs and tell me why the API requests are failing:
[paste 50 lines of log output]

Verdent は次の処理を行います。

  • ログをスキャンしてエラーパターンを探す
  • 認証失敗、ネットワークタイムアウト、データベースエラーを特定
  • 失敗に至る一連のイベントをトレース
  • エラーパターンに基づいて修正案を提示

ログ分析は、複数の失敗にまたがるパターンの特定や、エラーに至る一連のイベントの理解に役立ちます。

複雑な問題に対して、Verdent はマルチステップデバッグを使用します。

  1. エラーログを分析して失敗箇所を特定
  2. 関連コードを読み取り実装を理解
  3. 実行フローをトレースして問題箇所を発見
  4. コード例とともに修正案を提示
  5. 回帰を防ぐテストを生成

例:

The shopping cart total is sometimes incorrect. Here are the error logs: [paste logs]

Verdent は次の処理を行います。

  1. ログを分析し、バグの発生時点を特定(割引コードが適用されたとき)
  2. 割引計算のロジックを読み取る
  3. バグを特定(割引が税金の後ではなく前に計算されている)
  4. 修正案を提示(計算ステップの順序を入れ替える)
  5. テストケースを提案(割引ありのカート、税金ありのカート、両方ありのカート)

ベストプラクティス

早めにテストを生成する

機能の完成後ではなく、開発しながらテストを書きましょう。Verdent は新しい関数やコンポーネントを作成した直後にテストを生成できます。

既存のテストをスタイルガイドとして使う

Verdent はプロジェクトのテストパターンに合わせます。一貫したテスト構造を維持することで、Verdent が規約に沿ったテストを生成します。

エッジケースのテストを明示的に依頼する

境界条件、エラーシナリオ、異常な入力をテストするよう Verdent に依頼してください。「無効な入力と境界値のエッジケースを含むテストを書いて」のように指示します。

エラーメッセージを直接貼り付ける

エラーを言い換えないでください。正確な診断と迅速な解決のために、完全なスタックトレースを貼り付けます。

期待される動作と実際の動作を説明する

デバッグの際は、何が起こると期待していたか、実際に何が起こったかを明確に伝えてください。このコンテキストが Verdent による根本原因の特定に役立ちます。

複雑な機能にはマルチパステストを使う

重要な機能には、マルチパスサイクルによる包括的なテスト生成を依頼します。「決済モジュールの包括的なテストを生成して、すべて成功することを確認して」のように指示します。

リファクタリング後にテストする

コードをリファクタリングした後は、機能が維持されていることを検証するテストを依頼します。「リファクタリングした認証モジュールが正しく動作することを検証するテストを生成して」のように指示します。

デバッグとテスト生成を組み合わせる

バグを修正した後は、回帰を防ぐテストを依頼します。「このバグが二度と起きないことを保証するテストを書いて」のように指示します。


関連項目