Node.jsでfetchを使ってAPIテストを行う方法【動画版あり】
この記事について
この記事ではNode.jsでfetchを使ってAPIテストを行う方法について紹介します。なお、Node.jsでfetchを使えるようにするために node-fetch のnpmパッケージをインストールします。
おおまかな手順
おおまか手順を下記に示します。
- ソースコードの作成準備
- ソースコードの作成
- テストコードの作成準備
- テストコードの作成
- 動作確認
ソースコードの作成準備
ターミナルで下記のコマンドを実行してコーディングの準備をします。
mkdir nodejs-test-api
cd nodejs-test-api
npm init -y
npm install --save express
npm install --save-dev node-fetch@2
touch api.js
node-fetchをrequireを使ってインポートする場合はバージョン2である必要があるので@2を末尾に付加してインストールします。
ソースコードの作成
api.js
エディタでapi.jsを開いて下記の内容を入力します。
テストコードの作成準備
ターミナルで下記のコマンドを実行してコーディングの準備をします。
touch api.test.js
テストコードの作成
api.test.js
エディタでapi.test.jsを開いて下記の内容を入力します。
ポイントを下記に示します。
- node-fetchをfetchとしてインポートします。
- fetch関数を呼び出してAPIにアクセスします。
- assert.strictEqualを使ってステータスコードなどの実際の値と期待する値が一致することをチェックします。
- assert.deepStrictEqualを使うとオブジェクトの一致を丸ごとチェックできるので便利です。
動作確認
ターミナルで下記のコマンドを実行してAPIを起動します。
node api.js
続いて新規のターミナルを起動してから下記のコマンドを実行してAPIテストを実施します。
node api.test.js
上記のコマンドの実行結果が下記と一致することを確認します。
{ actual: { ok: true }, expected: { ok: true } }
OK getApiStatusTest
おわりに
HTTPリクエストを送信するライブラリとしては axios が有名ですが、fetchはフロントエンドのJavaScriptに標準搭載なので覚えることを少なくするためにnode-fetchを使ってNode.jsでもfetchを使えるようにしています。
単体テストやUIテストと比較してAPIテストはデータベースアクセスなども扱うことができる上にテストコードが書きやすいので他の2つに比べて重宝しています。Sequelize を使っている場合はsyncメソッド+テストデータのinsertを呼び出して必要なタイミングでデータベースを初期化できるようにすると便利です。
WebアプリによってはAPIへのアクセスに認証や認可が必要となりますがOAuth 2.0を使っていてClient Credentials Grantを利用できる場合はJWTなどのアクセストークンを Auth0 などの認可エンドポイントからもらう一手間が増えるだけなのでそれほど面倒ではありません。一方で認証にcookieを使っている場合はちょっと面倒です。私はWebブラウザで手動でログインしてから開発者ツールを使ってcookieを探してコピーし、テストコードを実行する時に環境変数などを使って渡しています。このやり方は手間ですし明らかにセキュアじゃない感じがするので何か良い方法をご存知の方がいましたらご指導のコメントをいただければ幸いです、その他のコメントも大歓迎です。最後までお読みいただきありがとうございました!
Discussion