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

スポンサーサイト

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

Piexifjsのテストを書く

                
tags: JavaScript
 オープンソースとしてライセンス条件下ではご自由にお使いくださいとしているライブラリにテストがないとちょっと敬遠されるだろう。本当に動くの?要件まともに満たしてるの?って具合に疑われて。昨晩書き上げたJavaScriptのライブラリがそんな状態だったのでテストを書いた。
 JavaScriptでテストは以前にPhantomJSを実行環境に使って書いたことがある。DOMをいじるライブラリではなく、ただバイナリデータとしてJPEGを処理するものなので、テストに使うデータとしてローカルファイルが読み込めれば楽だった。PhantomJSでならそれが可能だったので使った。
var fs = require('fs');

var content = fs.read('file.txt');
console.log('read data:', content);

http://phantomjs.org/api/fs/method/read.html

 今回はテストフレームワークを組み合わせて使ってみるかと思い有名どころのJasmineとQUnitを試してみた。しかしぼくの使い方との折り合いが悪いようで、JasmineやQUnitを組み合わせて使おうとしたらPhantomJSのAPIであるrequireが呼べなくなったので断念。PhantomJSで制御に使うrequireをPhantomJS上で作ったHTMLページ内では使えない。結局フレームワークなしでテストを書いた。
 
 JavaScriptの等価比較はやっかいなところがある。文字列や数値の比較は楽だが、配列や辞書型のように使っているオブジェクトの値の等価比較をどうするかといったあたり。JavaScriptでは"[1] == [1]"だろうが"[1] === [1]"だろうがfalseが返ってくる。配列は真面目にやるなら要素一つずつを比較して判断すべきだろう。
 とりあえず今回は型として文字列、数値、配列のみを考えているので、それらに対応した等価比較関数を書いてみる。配列以外はすべて"==="にかけられるので、オブジェクトが値として渡されてもそれぞれの出所が別ならfalseが返されてテストが通ることはないだろう。
function checkEqual(a, b) {
if (a instanceof Array) {
if (a.length !== b.length) {
return false;
}
for (var p=0; p<a.length; p++) {
if (!checkEqual(a[p], b[p])){
return false;
}
}
return true;
} else {
if (a === b) {
return true;
} else {
return false;
}
}
}

 配列の中に配列が入っているというケースはExifデータを表現しようとするとありえることなので、そこらをうまくやるために再帰を使った。再帰を使ったのは久しぶりだ。

 テストを書き終えたらTravis CIとの連携まで済ませるとよりいい。テストの実行結果がコンソール出力とともに残り、Webでいつでも確認できる。ライブラリを発見した人が自分の環境でテストをせずともテスト結果の確認が可能になる。
https://travis-ci.org/hMatoba/piexifjs
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

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

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