2024.11.14
いまさらNode.jsを知ろう~環境構築も~
2014.08.13
開発環境・ツールREST APIのテストを自動化する(Frisby)
こんにちは、KTです。
今回は、REST APIのテストの自動化について紹介します。
JUnitベースのRestfuseというツールもあるそうなんですが、今回は、Node.jsのツールであるFrisbyを使ってテストを自動化してみます。
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
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
インストールが完了したらテストスクリプトを作成しましょう。
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を参考にしてください。
作成したテストの実行は、jasmine-nodeコマンドを使用します。
テストスクリプトがあるディレクトリで下記コマンドを実行すればOKです。
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オプションをつけると、よりグルーピングの効果が分かると思います。是非試してみてください!
FrisbyというよりはJasmineの注意点ですが、基本的にコールバックベースで処理が進むため、全てのテストケースが並列で実行されます。
前のテストケースに依存して次のテストケースの挙動を変えるような処理は苦手(頑張れば出来なくは無いですが)なので注意してください。
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つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索