前書き
昨日調べてて知ったのですが、Mochaはブラウザでも動かせるんですね。普通に公式サイトに書いてありました。
ブラウザで動くと言っても、MochaのためにHTMLを一枚用意してその上で動かす感じなので、あくまでモジュールテストの用途になると思います。でもブラウザでしか動かないようなコード、例えばDOMいじりだとか Blob
周りだとかのテストができるのは嬉しいです。
それと特筆すべき点として、ブラウザで動かすMochaとChaiは unpkg.com から読み込むので npm install
が不要です。Node.jsが入ってないPCでも動かせるので、ちょっとMochaとChaiを試してみたい人にもいいかもしれないです。
以下、この記事では公式サイトを参考に、適当なCanvasのユーティリティ関数をテストしてみます。
サンプル
サンプルのディレクトリ構成は以下の通りです。
上に書いた通り、今回は npm install
不要なので node_modules
はありません。
各ファイルの内容は以下の通りにします。
一番特徴的なのは tests/runner.html
です。tests/runner.html
をブラウザで開くことでテストが実行され、結果が画面上に表示されます。
テストの再実行は tests/runner.html
のリロードで行えます。
ただし今回はブラウザを使っているので、テスト対象モジュールまたはテストコードを修正してリロードしてもキャッシュが残ってる場合があります。常にスーパーリロード (Chromeなら Ctrl + F5) するか、キャッシュを無効にするなどして対策してください。
また、ここでは公式のサンプルと同様に mocha.checkLeaks()
を有効にしてます。これを有効にしておくと、テスト実行中にグローバル変数が追加された時に global leaks detected
エラーを吐くようになります。予期せぬグローバル汚染が検知できるので、基本的には有効にするのが良いと思います。
が、筆者環境ではChromeの拡張機能が勝手にグローバル変数を追加して、テストと関係無いところで以下のようなエラーを吐いたりしてました。
今のところ『React Developer Tools』と『Vue.js devtools』が怒られてるのを見たので、入れてる方はテスト中は無効にするとかしておいた方がいいかもしれません。
サンプル (モジュール版)
上記のサンプルは、テスト対象モジュールをグローバルで読み込んでしまってます。気持ち悪いので、モジュール版サンプルも作ってみました。
ただしこちらはJavaScriptファイル内から別のファイルを読み込む関係上、tests/runner.html
をURL file:///C:/~
で開いてるとCORS制約にひっかかってしまいます。 これを回避するには tests/runner.html
をサーバー上で動かす必要があります。
というわけで、今回は [http-server](https://www.npmjs.com/package/http-server)
をインストールしてテスト用のローカルサーバーも一緒に立てるようにします。
簡単にテスト実行できるように、http-server
を起動しつつ tests/runner.html
をブラウザで開くnpmスクリプト『browser-test
』を用意します。
browser-test
コマンドの詳細は以下の通りです。
http-server ./
... プロジェクト直下 (./
) を公開フォルダとして指定して http-server
を起動する。
--port 8080
... ローカルサーバーをポート8080で起動する。
-c-1
... ファイルをキャッシュしないようにする。
-o /tests/runner.html
... ローカルサーバー起動後、ブラウザで http://localhost:8080/tests/runner.html
を開く。
そしたら、テストプログラムもモジュール用に修正していきます。
ディレクトリ構成は同じですが、各ファイルの内容が少しずつ異なります。以下、コメントで★印をつけてるところが差分になります。
これで、用意しておいたnpmスクリプトを以下のコマンドで叩けば、ブラウザで http://localhost:8080/tests/runner.html
が開いてテストが実行されます。
こっちの方が tests/runner.html
でテスト対象モジュールを読み込まずに済むので、Node.jsでMochaを使う時と近い感じになりますね。
以上
Mochaのこの機能を使ったテストは今やってる最中なので、もっと何かあったら追記します。
次回はたぶんAWS Lambda編です。