SwaggerClient と AVA で行う REST APIのテスト 前篇

OAS 3.0 に対応した swagger-client を利用して、テストフレームワーク ava で REST API のテストを実行してみましょう。

テストの準備

まずは必要なモジュールをインストールします。

$ npm i ava swagger-client

ava を使ったテストの準備を始めます。

適当な場所に,テスト用のファイルを作成します。avaでは複数の小さなテストファイルを並列で実行可能となっており、 シナリオやエントリ単位で細かくテストを記述つしていく事が可能です。

$ touch test/api.js

ファイルが作成できたら、以下のよう中たちのテストの枠組みを作成しておきましょう。

import test from "ava";


test.before("Before ", async t => {

});

test("SAMPLE TEST1",async t =>{

})

test.after("After", t => {

});

ava では import を用いた ESM 形式のモジュールインポートが可能で、 async await を使って Promise のテストを分かりやすく記述することが可能です。

mocha とは異なり、暗黙のグローバルは存在せず、 import した test のみを用いてテストを記述していきます。

Swagger のテスト

ava の準備が整ったところで Swagger のテストを記述していきます。

swagger-client をimport して 任意の Swagger 定義を読み込みましょう。

Swagger(url) の形式で Swagger 定義を読み込むと Promiseの形式でオブジェクトが得られます。

Promise から得られるこの client オブジェクトを用いて Swagger 定義を取得したり リクエストを送信したりすることが出来ます。

import Swagger from 'swagger-client'

const swaggerDef = 'http://localhost:8000/swagger/swagger.json'

let client;

test.before("Init Nuxt.js", async t => {

  client = await Swagger(swaggerDef);

});

client が生成出来たら、実際に リクエストを送信してみましょう。

リクエストの送信には、client.execute(options) を用います。

test("SOME TEST MESSAGE",async (t)=>{
  const res = await client.execute({
    pathName: "/master/items",
    method: "get",
    parameters: {
      page: 1
    }
  })
  t.truthy(res.status == 200)
  t.truthy(res.body.items.length > 20)
})

options 内で、上記のように pathName method を指定する事で任意のエントリに対して、リクエストを送信する事が出来るようになっています。
pathName method を用いる他にも operationId を用いてエントリを指定することも可能です。

parameters では pathパラメータや クエリパラメータなどを指定する事が可能です。

POST 送信などで利用する requestBody の指定には requestBody プロパティを用いて行います。

ava では async / await を用いた記述が設定無しで可能なため、REST API のテストなどPromiseを利用する場面の多いテストコードでは積極的に利用していきましょう。コードの可読性が飛躍的に上昇するはずです。

Promise で受け取る res オブジェクトには statusbody などの情報が入っており、これを用いてテストを実行することが可能です。

ava での assertion は クロージャの引数tを用いて t.truthy() のようにして行います。標準で PowerAssert が設定済みのため、内部で比較式などを書いてもキレイにエラーレポートを出力してくれるはずです。

なお、 async / await を利用しているため、 APIの clientError(4xx) / serverError(5xx) は 例外が throw されることとなります。
API の例外系のチェックを行う場合は テスト内で try…catchしてください。

test("SOME TEST MESSAGE",async (t)=>{
  t.plan(1) 
  try{
    const res = await client.execute({
      pathName: "/master/items",
      method: "get",
      parameters: {
        page: 100
      }
    })
  }catch(e){
    t.truthy(res.status == 404)
  }
})

plan テスト内で実行されるべきテストの回数を指定するための記述です。
コードがcatch 節を通らなかった場合、t.plan(1) の記述が反応しテスト失敗となります。

最後にこのテストコードを実行する場合、

$ ./node_modules/.bin/ava test/api.js

のような形でコードを実行します。

もちろん先に説明したとおり複数ファイルを並列に実行させることも可能なので、

$ ./node_modules/.bin/ava test/*.js

のような形で複数ファイルを指定して実行させることも出来ます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です