るいすときのこの物語

オタクエンジニアの雑記

Jenkinsとnewmanを組み合わせて自動APIテストを実現してみる


Postman + newman + Jenkins の組み合わせが結構便利だったので いつかの自分のために記事を残します。

 

Postman

API テスト ツール 何かで検索するとPostmanの記事を多く見ると思います。

Windows / Linux / Mac / Chrome で動作し 多くの機能を搭載しているAPIテストツールです。

詳しいことはこちらで解説されています。 http://dev.classmethod.jp/tool/api-test-with-postman-01/

 

newman

Postman と同じ会社が開発している Postman のCUI版とでも言うと しっくりくると思います。

Postman で作成したシナリオ(ジョブ)を実行できるツールです。 OSSとしてGithubから簡単に使うことができます。

今回は Postman で作成したテストケースを newman で実行し、Jenkins でデプロイ後に呼び出して自動APIテストをやってみます。

 

 

Postman で環境変数を作成する

今回はステージングで使う環境変数を作ってみました。

ここで作成した環境変数は{{host}}として参照できます。

詳しい解説などは先程紹介したインフラエンジニアの味方の クラスメソッドさんの記事を見てみてください。

 

Postman でコレクションを作成する

コレクションとは Postman で作成したジョブ(シナリオ)を 1つにまとめたもののことを言います。

1つ1つのジョブにTeststests["Status code is 200"] = responseCode.code === 200; を記述しておきます。こうすることでテストの際に1つの目印を作ります。

今回は例として上記のようなジョブをまとめたコレクションを作ってみました。

コレクションが作成し終えたら左上にあるRunnerを開いて 動作確認をしてみます。

 

環境変数とコレクションをエクスポートする

上記で作成した環境変数コレクションJSONでエクスポートを行います。 UIは直感的なので簡単に分かるかと思います。

エクスポートした2つのファイルを Jenkins の Workspace/ジョブ名 の中に コピーしておきます。

 

Jenkins に newman をインストールする

npmを使って簡単にインストールできます。 # npm i newman -g

newman で実際に動作するか確認してみる。 newman run STG-API.postman_collection.json -e staging.postman_environment.json --delay-request 500

-bash-4.2$ newman run STG-API.postman_collection.json -e staging.postman_environment.json --delay-request 500
newman

STG API

→ ユーザー登録
  POST https://hoge.com/users/register [200 OK, 493B, 226ms]
  ✓  Status code is 200

→ ユーザー認証
  POST https://hoge.com/users/authenticate [200 OK, 872B, 144ms]
  ✓  Status code is 200

→ ユーザー更新
  PUT https://hoge.com/users [200 OK, 345B, 45ms]
  ✓  Status code is 200

→ Refresh token
  POST https://hoge.com/users/authenticate [200 OK, 641B, 28ms]
  ✓  Status code is 200

→ スケジュール登録
  POST https://hoge.com/schedules [200 OK, 351B, 42ms]
  ✓  Status code is 200

→ スケジュール全取得
  GET https://hoge.com/schedules/user/114514 [200 OK, 10.54KB, 45ms]
  ✓  Status code is 200

→ 個別スケジュール取得
  GET https://hoge.com/schedules/44 [200 OK, 675B, 245ms]
  ✓  Status code is 200

→ スケジュール削除
  DELETE https://hoge.com/schedules/44 [200 OK, 345B, 39ms]
  ✓  Status code is 200

→ Instagramユーザー紐付け
  PUT https://hoge.com/instagram/4833744776 [200 OK, 343B, 30ms]
  ✓  Status code is 200

→ Instagram日付指定取得
  GET https://hoge.com/instagram/114514/?date=1495033200 [200 OK, 1021B, 40ms]
  ✓  Status code is 200

→ ユーザー削除
  DELETE https://hoge.com/users/ [200 OK, 345B, 42ms]
  ✓  Status code is 200

┌─────────────────────────┬──────────┬──────────┐
│                         │ executed │   failed │
├─────────────────────────┼──────────┼──────────┤
│              iterations │        1 │        0 │
├─────────────────────────┼──────────┼──────────┤
│                requests │       11 │        0 │
├─────────────────────────┼──────────┼──────────┤
│            test-scripts │       11 │        0 │
├─────────────────────────┼──────────┼──────────┤
│      prerequest-scripts │        0 │        0 │
├─────────────────────────┼──────────┼──────────┤
│              assertions │       11 │        0 │
├─────────────────────────┴──────────┴──────────┤
│ total run duration: 7.1s                      │
├───────────────────────────────────────────────┤
│ total data received: 12.18KB (approx)         │
├───────────────────────────────────────────────┤
│ average response time: 84ms                   │
└───────────────────────────────────────────────

実際は色文字で出力されてとても見やすい形です。 Jenkins が載っているサーバーで newman の動作確認ができたので 次に Jenkins のジョブに組み込んでみたいと思います。

 

Jenkins のジョブの設定

デプロイの方法は色々あるかと思いますが ビルドの最後にシェルの実行を追加しこんなスクリプトを追加します。

#!/bin/bash -eux
`newman run STG-API.postman_collection.json -e staging.postman_environment.json --delay-request 500`

newman のテスト終了後、正常時には0、エラー時は1exitで返ってくるので エラーが発生した場合、ジョブが失敗するのでこれだけで大丈夫だと思います。

面倒なことをやれば失敗時はSlackでテスト結果を送信みたいなこともできますが コンソール開いても分かるので良いかなって感じです。(Jenkinsの文字コードをUTF-8にする必要有)

 

最後に

テスト自体、エンジニアがローカルで行ってからデプロイする方法があったりしますが SNSと連携しているAPIだったり、ローカルとリモートでDBの構成が違ったり 割りと大変なんじゃないかなと思ってnewmanを導入してみました。

Postman は非常に便利です。 ここではとてつもなく大雑把に紹介しましたがチームでの共有だったり 1つのジョブの結果を変数に入れて次のジョブで使うなんてのも簡単にできます。