> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# C++のテスト

> ローカルのVillageSQLサーバーをセットアップし、MTRで拡張機能のリグレッションテストを実行し、テストの失敗をデバッグします。

このガイドでは、C++拡張機能のテストと反復のループについて説明します。ローカルサーバーのセットアップ、`.veb`ファイルのインストール、リグレッションテストの実行、失敗のデバッグを扱います。これは、初期ビルドを扱う[C++での拡張機能の作成](/docs/ja/mysql-8.4/0.0.5/create)、およびVDFの作成の詳細を扱う[C++開発](/docs/ja/mysql-8.4/0.0.5/development)の関連ガイドです。

<Note>
  （拡張機能を構築するのではなく）VillageSQLサーバー自体に貢献する場合は、[ソースからのビルド](/docs/ja/mysql-8.4/0.0.5/source)を参照してください。これは、`mysql-test-run.pl`を直接使用してテストを実行することを含む、完全なサーバー開発者ワークフローを扱います。
</Note>

## 環境のセットアップ

拡張機能を開発およびテストするには、ビルド済みのVillageSQLサーバーが必要です。[ソースからのクローンとビルド](/docs/ja/mysql-8.4/0.0.5/source)ガイドに従って、サーバーバイナリをコンパイルしてください。

ビルドができたら、`villagesql` CLIを使用してローカルの開発サーバーインスタンスを管理します。VillageSQLがインストールされたディレクトリからすべてのコマンドを実行してください。

### ローカル開発サーバーの起動

サーバーインスタンスを初期化して起動します。

```bash theme={null}
./villagesql init    # initialize database and seed bundled extensions
./villagesql start   # start the server (default port 3307)
./villagesql status  # check the server is running
./villagesql connect # open a mysql shell
./villagesql stop    # stop the server
```

初期化時にrootパスワードを設定するには：

```bash theme={null}
./villagesql init --password
./villagesql start
```

テスト実行のためにmysqldの機能を有効または無効にするには、`--`区切りの後にフラグを渡します。それ以降のすべては、そのまま`mysqld`に転送されます。

```bash theme={null}
./villagesql start -- --skip-name-resolve --general-log
```

`--`より前の認識されない引数は拒否されるため、`mysqld`向けのフラグにはすべて`--`を使用してください。

複数の独立したインスタンスを管理するには、任意のコマンドの前に`--dir <path>`を渡すか、`--here`を使用して現在の作業ディレクトリにサーバーディレクトリを作成します。

```bash theme={null}
./villagesql --here init
./villagesql --here start
```

### 拡張機能ファイルの管理

SQL経由で拡張機能をインストールする前に、その`.veb`ファイルがサーバー上に存在している必要があります。CLIはサーバーの`lib/veb/`ディレクトリを管理します。

```bash theme={null}
./villagesql veb add /path/to/my_extension.veb  # copy a .veb to the server
./villagesql veb ls                              # list available .veb files
./villagesql veb rm my_extension                # remove a .veb file
```

`init`の前に`lib/veb/`に配置された`.veb`ファイルは、自動的にシードされます。ファイルを追加した後、SQL経由で拡張機能をインストールします。

```sql theme={null}
INSTALL EXTENSION my_extension;
```

## リグレッションテストの実行

VillageSQLビルドディレクトリからMySQL Test Runnerを使用して、拡張機能のリグレッションテストを実行します。

### スイート全体の実行

拡張機能のすべてのテストを実行するには：

```bash theme={null}
cd $BUILD_HOME
./mysql-test/mysql-test-run.pl --suite=/path/to/your/extension/mysql-test --parallel=auto
```

### 個別のテストの実行

単一のテストケースを実行するには、スイートパスとテスト名を指定します。

```bash theme={null}
cd $BUILD_HOME
./mysql-test/mysql-test-run.pl --suite=/path/to/your/extension/mysql-test my_test_name
```

## 新しいテストの作成

新しい機能を追加したりバグを修正したりする場合は、対応するリグレッションテストを追加する必要があります。

### テストの場所

拡張機能のテストは、VillageSQLサーバーの`mysql-test/suite/`ツリーではなく、拡張機能自体のリポジトリ内の`mysql-test/`ディレクトリに配置されます。

* テストファイルは`.test`で終わり、`mysql-test/t/`に配置します。
* 期待される結果ファイルは`.result`で終わり、`mysql-test/r/`に配置します。

たとえば、`my_extension`という名前の拡張機能の場合：

* `mysql-test/t/my_new_test.test`
* `mysql-test/r/my_new_test.result`

### テストファイルの規約

一般的な拡張機能のテストは、拡張機能をインストールし、SQLを実行し、アンインストールします。

```sql theme={null}
# Description of the test

INSTALL EXTENSION my_extension;

# ... Your Test Code Here ...
CREATE TABLE t1 (val MYTYPE);
INSERT INTO t1 VALUES ('some_value');
SELECT * FROM t1;
DROP TABLE t1;

UNINSTALL EXTENSION my_extension;
```

テスト出力にテストランナーの一時ディレクトリのパスが含まれる場合は、それらを正規化するために`.test`ファイル内に次のディレクティブを追加します。これがないと、記録された結果には絶対パスが含まれ、他のマシンで動作しなくなります。

```sql theme={null}
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
```

### テストを追加する手順

1. 拡張機能の`mysql-test/t/`ディレクトリに、**`.test`ファイルを作成します**。
2. 拡張機能の`mysql-test/r/`ディレクトリに、**空の`.result`ファイルを作成します**。
3. **`--record`を付けてテストを実行します**。期待される出力を生成します。
   ```bash theme={null}
   cd $BUILD_HOME
   ./mysql-test/mysql-test-run.pl --suite=/path/to/your/extension/mysql-test --record my_new_test
   ```
4. 生成された`.result`ファイルで**出力を確認し**、期待どおりであることを確認します。

## テストのデバッグ

テストが失敗した場合、テストフレームワークは詳細なログを提供します。

* **テスト出力：** `mysql-test/var/log/mysqltest.log`（統合）または`mysql-test/var/log/<test_name>/`（テストごとのディレクトリ）を確認します。
* **サーバーエラーログ：** `mysql-test/var/log/mysqld.1.err`を確認します。VillageSQL固有のログメッセージ（`LogVSQL()`経由で出力されるもの）は、サーバーが`--log-error-verbosity=3`で実行されている場合にのみ表示されます。
* **差分：** フレームワークは、実際の出力と期待される`.result`ファイルとの間の差分を出力します。

追加のデバッグ情報を付けてテストを実行するには：

```bash theme={null}
cd $BUILD_HOME
./mysql-test/mysql-test-run.pl --verbose --suite=/path/to/your/extension/mysql-test my_new_test

# To surface LogVSQL() messages in the error log:
./mysql-test/mysql-test-run.pl --mysqld=--log-error-verbosity=3 \
    --suite=/path/to/your/extension/mysql-test my_new_test
```

## 関連項目

* [ネットワーク依存の拡張機能のテスト](/docs/ja/mysql-8.4/0.0.5/testing-network) — HTTPサーバーや外部リスナーを起動する拡張機能のための信頼性の高いMTRパターン
* [C++での拡張機能の作成](/docs/ja/mysql-8.4/0.0.5/create) — エンドツーエンドのビルド手順、CMakeのセットアップ、およびインストール
* [C++開発](/docs/ja/mysql-8.4/0.0.5/development) — VDFの作成の詳細、引数と結果の型、集約、可変長引数
* [C++ APIリファレンス](/docs/ja/mysql-8.4/0.0.5/extension-api-reference) — VDFの契約、null処理、およびバッファサイジング
