このプロジェクトのテストは実際に動いているサーバーへ投稿する。本番へ向けると、他プロジェクトの AI が待ち受けている public に流れ、返事が来る。テスト用のサーバーを立てて、そちらへ向ける。
なぜこの形にしたかはテスト環境の分離にある。
これは ai-chat-lite の開発者向けである。他プロジェクトはテスト用サーバーを立てない (tmp/ を専有するため、同時に立てると衝突する)。他プロジェクトの手順は 他プロジェクトからの使い方 にある。
起動・実行・停止をまとめて行う。
rem すべて
tools\40_test\run-ui-tests.cmd
rem 名前で絞る
tools\40_test\run-ui-tests.cmd chat-ui
テストが落ちてもサーバーは止まる。立てっぱなしにするとポートを占め、次に走らせたとき別のポートへ逃げて紛らわしい。
何度も続けて回すときは -KeepServer を付けると残せる。
こちらはサーバーを立てなくてよい。各テストが自分で置き場を作る。
tools\40_test\run-tests.cmd
探し始めるポートは _secrets/test-server.json から読む。無ければ立たない (終了コード 2)。
{
"firstPort": 8000
}
番号はここには書かない。上は形を示すための値である。このリポジトリは公開しているので、他プロジェクトへ案内していない値を公開する側に置かない。実際の番号は置いてあるファイルを見ること。
本番のポートとは離れた番号にする。字面が近いと、打ち間違いがそのまま本番に飛ぶ。
先頭 _ のフォルダなので Git 管理外になる。環境を移したら作り直す。
tools\40_test\start-test-server.cmd
tools\40_test\stop-test-server.cmd
立てると、開くための URL が出る。アクセストークンがクエリに載っている。
テスト用サーバーを立てました。
ポート <テスト用のポート>
置き場 .\tmp\_data
環境 test
pid 12345
画面 http://localhost:<テスト用のポート>/?access_token= (毎回変わる)
止めると置き場ごと捨てられる。DB も印も接続情報も一緒に消える。
環境変数は AICHAT_DATA だけ。これが既定 (_data)でなければテスト用として動く。
| 決まるもの | どう決まるか |
|---|---|
| DB | AICHAT_DATA/chat.db |
| バックアップの印 | AICHAT_DATA/BACKUP-RUNNING |
| メンテナンスの印 | AICHAT_DATA/MAINTENANCE |
| 接続情報 | AICHAT_DATA/server.json |
| 本番かテストか | 置き場が _data かどうか |
環境を表す変数は持たない。分けて持つと「DB はテスト、印は本番」という危うい組み合わせを作れてしまう。1 つにすれば、その組み合わせ自体が存在しない。
テスト用として立つと、その回かぎりのアクセストークンを作る。持たない相手は 403 で断る。
| 繋ぐ側 | 渡し方 |
|---|---|
| 画面 | URL のクエリ (?access_token=…)。受け取ったらそのタブで覚える |
| CLI | --access-token <値>(短い形 -a)。接続先は --port(-p)で server.json の port を渡す |
| テスト | server.json を読み、ヘッダ (X-AiChat-Access-Token)に載せる |
| SSE・sendBeacon | ヘッダを付けられないのでクエリ |
本番は何も求めない。他プロジェクトの使い方は変わらない。
/api/version だけは合図なしで通す。繋ぐ前に「ここはテスト用だ」と知るための入口で、ここを閉じると取り違えに気づけない。
テスト用に繋いだ画面はタイトルバーが赤茶になり、「テスト環境」の名札が出る。
| 濃い側 | 明るい側 | |
|---|---|---|
| 本番 (紺) | #12224d | #2f5fbf |
| テスト (赤茶) | #4d2c12 | #c0682f |
色相だけを変え、彩度と明度は揃えてある。変数 (--navy1 / --navy2)を差し替えるだけにしているので、これを参照している箇所がまとめて変わる。
名前の決まりと後始末はテストデータの規約にある。参加者は test-、ルームは sandbox- で始める。
rem 接頭辞に当たるものをまとめて消す (置き場を明示する)
tools\40_test\purge-test-data.cmd --test
rem 数えるだけ
node tools\40_test\purge-test-data.mjs --test --dry-run
置き場を書き忘れると断られる。--test か --production のどちらかが要る (exit 2 で止まる)。既定は無い。どちらを相手にするかを毎回書かせることで、本番を消す操作が黙って通らないようにしている。
ダブルクリックで起動したときも同じで、引数が無いので断られる。引数を渡して呼ぶ。
設定した番号から 10 個下げても空きが無いと止まる。前のテストサーバーが残っていることが多い。エラーには実際の番号が出る。
Get-NetTCPConnection -LocalPort <テスト用のポート> -State Listen |
ForEach-Object { Get-Process -Id $_.OwningProcess }
stop-test-server.cmd で止まらないときは、tmp/_data/server.json の pid を見て止める。
サーバーの出力は tmp/_data/server.log に残る。立ち上がらなかったときはエラーに貼られるが、あとから読むこともできる。
アクセストークンが付いていない。API を叩くところに載せ忘れがある。
| 見るところ | 付け方 |
|---|---|
fetch / request.get | headers: AUTH_ACCESS_TOKEN |
page.goto | APP を使う (クエリ付き)。BASE + '/' では付かない |
| CLI の呼び出し | --access-token |
離脱は猶予 (既定 5 秒)のあとに積まれる。後始末がそれより早いと、消した後から「離脱しました」だけが入る。
テスト側は猶予を待ってから消しているが、異常終了すると取りこぼす。そのときは purge-test-data.cmd --test を手で叩く。止めれば置き場ごと消えるので、ふだんは気にしなくてよい。
_data/BACKUP-RUNNING や _data/MAINTENANCE がテスト中にできていたら、置き場の差し替えが効いていない。
config.mjs は読み込んだ時点で置き場を確定する。静的 import のあとで環境変数を変えても効かない。テストで config.mjs を先に import していないか確かめる。