[課題] カバレッジを計測したい!!
基本、アプリ作成する時は、ユニットテスト(JUnitとか)を書きながら、コードを書いていきます。
動作確認しながらコードが書けるので作業がはかどります。
しかし、自分が書いたユニットテストが想定した通りのできか?うまくテストできているか?
を確認するすべはありません。
どの程度テストできているかを定量的に客観的に数値化する方法があれば、
それらを確認するすべになります。※テスト作成のど忘れとした時に、気がつくことができます!!
KyoroTextでしようとしている方法について解説します。
客観的なデータがあれば、うまく想定したとおりにテストできていることが保障できます。
保障できないにしても心の安心を得ることはできるでしょう。
[カバレッジ]
どの程度テストができているかを計る方法として、カバレッジという表現があります。
まずは、AndroidでCoverageをとる方法について解説します。
#カバレッジとは何か?
Coverageは、テストした時にどの程度の網羅性があるかを数値化します。
具体的には、「テストできたクラスはのどのくらい?」「テストできたメソッドはどのくらい?」
「テストできた行はどのくらい?」といった事を計測するのです。
例えば、以下のようなコードがあったとして
public void test(int a) {
if(a>10) {
--A--
} else {
--B--
}
}
aが、11の時だけテストしたとすると、50%のテストができたといえます。
aが、11の時と、aが10の時をテストした場合、100%のテストができたといえます。
このように、自分が書いたコードがテストとできているかを、客観的にあらわす事ができるのです。
これがCoverageです。
[EMMA]
EMMAというツールを使うことで簡単にカバレッジをとる事ができます。
EMMAはJavaのクラスファイルを書き換えます。
すべてのif文の前後、メソッドの先頭等に、Coverageを測定するためのコードを埋め込みます。
EMMAは単純に、埋め込んだコード上で通過した部分を記録しておき。アプリが終了するタイミングで、そのデータをストレージ上に記録します。
[EMMA Android]
Androidには、EMMAがすでにSDKに含まれています。
今回はそのまま、Androidに含まれている機能を使用することにしました。
※ 実現方法とかは機会があれば解説したいです。今回はしません。
1. antからビルドできるようにする。
---> cd {ターゲットのprojectがある場所}
---> android.bat update project --path .
2. テストプロジェクトともantからビルドできるようにす。
---> cd {ターゲットの test projectがある場所}
---> android update test-project -m <ターゲットのprojectの絶対パス> -p .
3. emma用にAPKをビルドする。
---> cd {ターゲットのprojectがある場所}
---> ant emma debug install
4 . テストプロジェクトもビルドする。
---> cd {ターゲットの test projectがある場所}
---> ant emma debug install test
後は結果がでます。
[成果物]
#サンプルのコードを書きました。
https://github.com/kyorohiro/KyoroSamples/tree/master/EmmaSample
- runtest.sh
テスト実施します。
- createbuildxml.sh
ビルド環境を作ります。
#以下のような、Coverageの結果が出力されます。
https://github.com/kyorohiro/KyoroSamples/tree/master/EmmaSample/tests/bin
[参考]
http://d.hatena.ne.jp/halts/20120201/p1
http://blog.pboos.ch/post/35269158339/android-coverage-report-for-unit-tests
[次回]
Google Playで、KyoroStressが1000ダウンロードを超えました。KyoroStressについて解説します。
Androidで、アプリが殺されるタイミングは何?殺された時、殺された後のアプリの動作は何?
といった事を解説します。
2013年2月11日月曜日
KyoroText で使用されている技術 その12 AndroidでCoverageを計測したい
登録:
コメントの投稿 (Atom)
mbedtls dart の 開発を始めた web wasm ffi io flutter
C言語 で開発した機能を、Dart をターゲットとして、Web でも サーバーでも、そして Flutter でも使えるようにしたい。 そこで、mbedtls の 暗号化の部分を Dart 向けのPackageを作りながら、 実現方法を試行錯誤する事にした。 dart...
-
[課題] Low Memory Killer を意図的に発生させたい Androidには、ヒープが涸渇すると使われていないアプリをKillする機能があります。 この記事では、意図的にヒープを枯渇させて、この状態をつくる方法について説明します。 単純にヒープを大...
-
Dart の Native Extensions を利用して、 SDL を用いたマルチプラットフォームのゲーム開発環境を作れるか検証してみた。 結論からいくと、 「Mac 上で動作する SDL x Dart の アプリは動作させることが難しいよ」 と言うことです。 Wind...
-
Emscripten と OpenGLを使ってゲームを作ろうと思いたって、 まずは、SDL2の基本的な使い方を試していた。 しかし、今の所は、SDL 1系 の方が、良いと思いました。 SDL2があるのに、SDL1 を選ぶのはなぜか? # 201...
実端末で、emmaを利用したい場合は、
返信削除android sdkのbuild.xmlを変更してください。
具体的には
<< property name="emma.dump.file"
value="/data/data/${tested.project.app.package}/coverage.ec"
<<property name="emma.dump.file"
value="/mnt/sdcard/coverage.ec"
とかに変えると良いです。
[補足2]
返信削除subantで失敗するような場合は、テスト対象へのパスの設定を手動でする。
「android update test-project」の後に生成される。
ant.properties にパスが書かれています。
それを編集すると良いです。
tested.project.dir=
となっています。
これを削除して、
tested.project.absolute.dir=////
を使用して絶対パスを指定してください。
[補足3]
返信削除ライブラリプロジェクトのテストをする場合、ant.propertiesに以下を追加してください。
android.library.reference.1=ライブラリへの相対パス
※ ライブラリプロジェクトもantでビルドできる必要があります!!