主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JavaScript: PhantomJS上で動かすローカルファイルデータが使えるテストフレームワーク

                
tags: JavaScript
 JavaScriptでローカルファイルを使ったミニマムなテストをしたい。そんなときにはPhantomJSが役立つ。
 たとえば文字列型のデータがJPEGファイルのものかどうかを判断する関数を作ったとする(今回は間に合わせのためPythonのimghdrを参考に適当なものを書いておく)。
function isJPEG(data) {
var s = data.slice(6, 10);
if (s == "JFIF" || s == "Exif") {
return true;
} else {
return false;
]
}


 この関数をテストするにはJPEGファイルを読み込み、そのデータを渡してやりたい。従来のJavaScriptの基本実行環境であるブラウザは制約からスクリプトで能動的にローカルファイルを読み込むことができない。ユーザのアクションによって読み込むことはできるが、それはつまり手動でテストしろということである。自動でテストするならこの制約を取っ払わなければならない。
 サーバを立てれば、JavaScriptもそこにリクエストをして能動的にファイルを読み込むことができる。でもたかがこのくらいでサーバを立てるのも手間である。
 ヘッドレス(GUIなしのコマンドラインのみって意味)なJavaScript実行環境であるPhantomJSでは下記のようにしてローカルファイルも読み込める。
var fs = require("fs");
var jpeg = fs.read("foo.jpg", {charset: "LATIN-1"});

 ということは最初に出てきたJPEG判別の関数も簡単に試すことができる。
var fs = require("fs");
var jpeg = fs.read("foo.jpg", {charset: "LATIN-1"});
if (isJPEG(jpeg)) {

 つまりPhantomJSをJavaScriptの実行環境に使うとファイルデータを使ったテストが楽に行えるということ。


 JavaScriptのテストフレームワークであるJasmineやQUnitはPhantomJS環境用のテストランナーがある。それらは基本的にWebページでのDOM操作などのようなJavaScriptテストを想定していて、テストランナーによって走るテストではrequire関数が使えずローカルファイルが読み込めない。ぼくがやりたいテストはローカルファイルのデータがテストに使えないのは困る。そんなわけでPhantomJS環境用のテストフレームワークを自作してみた。
https://github.com/hMatoba/Phestum
・条件としてクライアントサイドJavaScript
・バイナリデータをいじるようなライブラリのテストがしたい
・ローカルファイルのデータを読み込んでテストに使いたい
・HTMLを書きたくない、結果はコンソールで見る
そんな考えを反映させたテストフレームワーク。動作はPhantomJS上のみだが、PhantomJSはWindowsにも用意されているしTravis CIでもデフォルトで使えるので汎用性は高い。

 テストというとぼくの頭にあるのはPythonのunittestだ。ディレクトリに既定の書き方でテストを書いて置いておくと、コマンドひとつでテストを書いたスクリプトを読み込んで自動でテストを実行してくれる。どれがテストスクリプトを書いたファイルだと指定する必要がない。真似した。
 testsディレクトリを作ってそこにテストを書いて置いておく。テストはスクリプト内にTestsオブジェクトのメソッドとして書いていく。テストとして書いたメソッドはメソッド名に”Test”を含めるようにしておく。
// tests/tests.js
Tests.Test1 = function () {
console.log("do nothing");
};

Tests.Test2 = function () {
phestum.assertEqual(0, 0);
phestum.assertNotEqual(0, 1);
};


testsディレクトリにテストを置いたらコマンドを打ってテストを走らせる。
> phantomjs phestum.js

読み込ませておきたいライブラリはコマンドに引数で列挙しておく。
> phantomjs phestum.js lib/lib1.js lib/lib2.js

データを使いたいローカルファイルはディレクトリtests/filesを作ってそこに入れておく。Testsオブジェクトのプロパティからファイル名でデータを得られる。バイナリデータを想定してファイルはLATIN-1で読み込んでいる。
Tests.ShowFilesTest = function () {
var files = Tests.files;
for (var filename in files) {
console.log(filename + ": " + files[filename]);
}
};


 assert系統のメソッドはphestumというオブジェクトにassertEqual、assertNotEqual、assertFailが実装されている。

 とりあえず突貫で書いたのでまだまだ変更があるかもしれないが、ローカルファイルを使うスクリプトのテストをPhantomJS環境で行うものができた。あとはJasmineやQUnit、Pythonのunittestを参考にもうちょい便利なテストフレームワークというものを考えてみる。
https://github.com/hMatoba/Phestum
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。