Titaniumでユニットテスト

公式のドキュメントには何の記述もないが、ユニットテストには好きなJavaScriptのテスティングフレームワークを利用できる。
ただしブラウザに依存しないもので、ログの出力をフックできるものに限る。

要はTitaniumのコンソールにログを出力するためにTitanium.API.infoやTitanium.API.errorなどにテストの出力を渡せればよいわけです。

今回はxUnit系で一番勢いがありそうなQUnitとBDD系でよいと言われているJasmineで試してみた。

QUnitを使う

Titanium用のアダプターがGitHubで公開されている。

lukaso/qunit – GitHub

自分のプロジェクトで利用する場合はResources以下に次のファイルを設置すればOK。

* runner.js
* qunit/qunit.js
* qunit/titanium_adaptor.js
* test/tests_to_run.js

そしてtest/tests_to_run.jsにテストを書いていく。
app.jsのどこかでrunner.jsをincludeすればテストが実行される。

titanium_adaptor.jsの内容を見てみると、やっていることはQUnitのロギング処理のフックを利用してTitaniumのコンソールにログを出力しているということだけ。
なので出力をいじりたい場合は好きなように書き直すのも難しくはない。

動作確認のためのapp.jsへの追記

app.js_snippetにはタブグループにユニットテスト用のタブを追加しているが、確認のためだけなら単にapp.jsのおしりに以下の行を追加するだけでもテストは動く。

Titanium.include('runner.js');
動作確認のためのtest/tests_to_run.js

何のテストにもなっていないが、QUnit動作確認のためだけのサンプルコード。

module("QUnit on Titanium");
test("okのテスト(パスする)", function () {
    ok(true);
  }
);

test("equalのテスト(パスしない)", function () {
    equal('hogehoge', 'hige');
  }
);

うまく動けば結果がTitaniumのコンソールに表示される。

ちなみに結果にHTMLが含まれていて見にくいのでQUnit-TAPを使ってスッキリできないかと思って試してみたがイマイチうまくいかなかった。

Jasminを使う

Jasmineはテストの出力を扱うReporterを定義できるようになっているので、Titanium用のReporterを作ってやればよい。

jasmine.jsの中にReporterクラスがベースとして用意されているので、それに沿ってカスタムのReporterクラスを作る。
実際の実装は公式のJasminの配布に含まれているjasmin-html.jsやjasmine.console_reporter.jsが参考になる。

という説明だけでもなんだと思うので、実装がとっても中途半端だけど自作のTitaniumReporterのコードを以下に置いておく。一応動きます。

gist: 736193 – TitaniumReporter for Jasmine- GitHub

2011/02/17追記

出力を見やすくしたReporterを含んだJasmine Titaniumを公開しています。

動作確認のためのapp.jsへの追記

またしても何のテストにもなってない、Jasmineの動作確認のためだけのコード。
Resorses/jasmine以下にjasmine.jsとjasmine-titanium.js(上記のTitaniumReporter)が置いてある前提で。

Ti.include('jasmine/jasmine.js');
Ti.include('jasmine/jasmine-titanium.js');

describe("Jasmine Sample", function() {
    it("pass!", function() {
        var foo = 2;
        expect(foo).toEqual(2);
      }
    );
});

describe("Second Jasmine Sample", function() {
    it("fail!", function() {
        var foo = 1;
        expect(foo).toEqual(2);
      }
    );
});

jasmine.getEnv().addReporter(new jasmine.TitaniumReporter());
jasmine.getEnv().execute();

うまいこと動いたら失敗するテストとトータルの結果のみが表示される。

実際の開発ではspecのディレクトリを掘ってそっちにテストコードをまとめていくのがよいかと思われます。
追記:というかspecというディレクトリがなかったり、あっても空だったりすると起動できなかった。

参考

Titanium
QUnit
Jasmine

備考

この記事を書いた人はTitaniumもJavaScriptも初心者です。

2011/01/21追記

もそっとTitanium+Jasmineについて掘り下げた。

2011/02/10追記

今更ながらに公式にDrillbitというテスティングフレームワークがあることに気がつきました。

ところで「Titanium Drillbit」でぐぐるとチタン製のドリルねじの情報がわんさか出てきてフイタw

2011/02/11追記

Drilbit動かない!動かしにくい!

と言うことで俺はJasmineでがんばる。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

  1. […] Titaniumでユニットテスト – UnitTest […]

トラックバック URL