メニューを閉じる

テクノデジタルグループ

メニューを開く

2014.08.13

開発環境・ツール

REST APIのテストを自動化する(Frisby)

こんにちは、KTです。

今回は、REST APIのテストの自動化について紹介します。

JUnitベースのRestfuseというツールもあるそうなんですが、今回は、Node.jsのツールであるFrisbyを使ってテストを自動化してみます。

 

1. 準備

Node.jsのツールなので、まずはNode.jsの準備をしましょう。

前回でも使った、Vagrantを使って環境を構築していきます。

(別にLinuxの環境を立ち上げなくても、ローカルにNode.js入れれば動くはずですが、あまりローカルを汚したくないので今回はLinuxを立ち上げてます)

mkdir test && cd test
vagrant init centos65  # ローカルマシンのvagrantに追加したboxを使ってください
vagrant up
vagrant ssh
su -  # pass -> vagrant
yum upgrade
yum install vim

 

Vagrantを使ってLinuxマシンを立ち上げたら、Node.jsをインストールします。

rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install nodejs npm --enablerepo=epel
node -v
npm -v

 

 

2. Frisbyのインストール

Node.jsの準備が終わったら、テスト用のディレクトリに移動してFrisbyをインストールしましょう。

同時に、JavascriptのテスティングツールであるJasmineをインストールします。

mkdir /var/test && cd /var/test
npm install frisby
npm install -g jasmine-node

 

これで、インストールは完了です。

Jasmineを使うときの慣習として、specディレクトリ以下にテストスクリプトを置く必要があるので、specディレクトリを作成して移動しておきましょう。

mkdir spec && cd spec

 

 

3. テストスクリプトの作成

インストールが完了したらテストスクリプトを作成しましょう。

Jasmineを使うときの慣習として、〜_spec.jsという名前で作る必要があります。

今回はtest_spec.jsという名前で作成します。

vim test_spec.js

test_spec.js

var frisby = require('frisby');

// 初期設定
frisby.globalSetup({
    request: {
        headers: {}
      , json: true
      , inspectOnFailure: true
    }
});

// テストケース
frisby.create('sample test case')
    .timeout(5000)
    .get('http://sample.api.com/test/api?param=aaa')
    .expectJSON({
        'res' : {
            'param': 'aaa'
        }
    })
    .toss();

 

Frisbyのテストケースは、上記のようにcreateからtossまでのメソッドチェインで作ります。

createにはテストの説明(jasmineでいうdescribeやitの第一引数ですね)を渡します。

次にタイムアウトやHTTPヘッダなどの設定を行い、get / post / put / deleteなどのメソッドでHTTPメソッドとテスト対象のURLを設定します。

その後、expectJSONやexpectHeaderなどで期待値を設定し、

最後にtoss()をコールすることで、テスト結果をJasmineの結果として生成します。

詳細は下記URLを参考にしてください。

http://frisbyjs.com/

http://blog.asial.co.jp/1259

 

4. テストの実行

作成したテストの実行は、jasmine-nodeコマンドを使用します。

テストスクリプトがあるディレクトリで下記コマンドを実行すればOKです。

jasmine-node .

 

5. Jasmine-Nodeとの連携

Frisbyは、内部でJasmine用のテストメソッドを使ってテストを実施し、最終的にテスト結果をJasmineの結果として出力しています。

下記のように、frisby.jsのtossメソッドでJasmineのdescribe、itを呼んでJasmineのテストとして処理しています。

Frisby.prototype.toss = function(retry) {
  :
  :
  describe(self.current.describe, function() {
    it("nt[ " + self.current.itInfo + " ]", function() {
      var it = this;
      :
      :

 

このため、以下のようにFrisbyのテストをJasmineのdescribeやitを使ってグルーピングすることができます。

describe('Test API', function() {
    describe('regular test', function() {
        it('with cache', function() {
            frisby
                .create('Test API with cache')
                .get('http://sample.api.com/test/api')
                .expectStatus(200)
                .toss();
        });
    });
});

 

ただ単にfrisbyを並べるだけでも分かりやすいですが、このようにグルーピングすることでより分かりやすくなりますね。

また、jasmine-node実施時に–verboseオプションをつけると、よりグルーピングの効果が分かると思います。是非試してみてください!

 

6. 注意点

FrisbyというよりはJasmineの注意点ですが、基本的にコールバックベースで処理が進むため、全てのテストケースが並列で実行されます。

前のテストケースに依存して次のテストケースの挙動を変えるような処理は苦手(頑張れば出来なくは無いですが)なので注意してください。

 

7. 拡張

FrisbyはMITライセンスのため、改変は自由に行えます。ということで、不便な所はどんどん拡張しちゃいましょう!

例として、私が拡張した内容について一部紹介します。

Frisbyには各テストの開始前に実施されるbeforeEachはあるのですが、テスト毎に指定する方法が無かったので作っちゃいました。

 

node_modules/frisby/lib/frisby.js

まずは、適当なところで

Frisby.prototype.before = function(func, args) {
  this.current.before = func;
  this.current.beforeArgs = args || [];
  return this;
}

 

と宣言しておいて、

toss()メソッド内で

Frisby.prototype.toss = function(retry) {
  :
  :
  describe(self.current.describe, function() {
    it("nt[ " + self.current.itInfo + " ]", function() {
      var it = this;

      // ここに追加!
      if (typeof self.current.before === 'function') {
        self.current.before.apply(null, self.current.beforeArgs);
      }
      // ここまで

 

というように追加すれば、beforeメソッドの追加完了です(・∀・)

 

使い方は

frisby
    .create("test")
    .before(function(msg) {
        console.log(msg);
    }, 'test message')
    .get('http://sample.api.com/test/api')
    .expectStatus(200)
    .toss();

 

というふうに、beforeメソッドにテスト前に実施させたい処理を渡せばOKです。

 

例えば、テスト実施前に別のAPIをコールしたいときでも

beforeメソッドでAPIをコール→

API戻り時にフラグをセット→

waitsForでフラグがセットされるまで待ってからテストを実施!

のようにすれば簡単にかけますね(・∀・)

 

 

 

以上、最近、正妻がRubyからJavascriptに変わりつつある…


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事