2012-02-01
Androidでのテストとカバレッジ測定メモ
先日、TkMixiViewer の某機能*1の実装時にTDDが必要になり、JUnit 環境を用意した。
テストプロジェクトを作ってテスト対象クラスの1メソッドに対してテストケースを作るだけ。
参考URL
そこでこの機会に全体的にテストケースを(いまさらながら)整備したくなった。
やみくもに作っても終わりが見えずモチベーションが保てないので、テストの指標値の1つである C0 カバレッジを計る環境を構築した。
最近の Android SDK には emma というカバレッジ測定用のライブラリ(かな?)が含まれているので環境構築自体は比較的簡単だと思う。
emma は djUnit のような Eclipse に統合された環境ではなくコマンドラインから実行するのが残念だけど、emulator で実行する都合などを考えると仕方ない気もする。
これまで Eclipse のみで開発してきたので ant 用設定ファイル(build.xml等)がないなど、いくつかめんどくさいポイントがあったけど、一度環境を整えてしまえばあとはバッチでも流すだけ。Jenkins さんも導入したほうがいいのかなー。Ubuntu に立てようかな。
生成された coverage.html はこんな感じ↓
これを 100% に近づけるべくテストケースを整備していこう。
# TkMixiViewerのパーサーなのに MZ3Parser.java だったりする
以下、メモ。
OSなど
参考URL
- testing - How to use EMMA code coverage in android - Stack Overflow
- Coverage report for Android unit tests | pboos.ch
- Testing In Other IDEs - Android Test and Evaluation Club (ATEC)
- Jenkins で Android UnitTest を自動実行してカバレッジを採取する。 | まったり覚書
主な手順
- 対象プロジェクト本体(TkMixiViewer)およびライブラリプロジェクト(QuickActionLibなど)のbuild.xml生成
> cd TkMixiViewer > android update project --path .
- テストプロジェクト(TkMixiViewerTest)のbuild.xml生成
> cd TkMixiViewerTest > android update test-project -m d:\Src\workspace\TkMixiViewer -p .
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_25
- 対象プロジェクト本体のビルド、インストール
> cd TkMixiViewer > ant emma debug install
- emulator起動
- テストプロジェクトのビルド、インストール、テスト
> cd TkMixiViewerTest > ant emma debug install test
- 上記手順で coverage/coverage.html が生成される。
うちの環境特有の問題・はまりポイント
- ant がないので導入。
- JDK がないので導入。
- 文字コードがSJISなので ant 失敗。全ソースコードを UTF-8 に変換。
- coverage.html が ISO-8859-1 なので UTF-8 に変更。
- report.html.out.encoding がプロパティファイル等に書いても認識されないので ${android-sdk}\tools\ant\build.xml に記述。かっこわるい。
<emma>
+ <property name="report.html.out.encoding" value="UTF-8" />
<report sourcepath="${tested.project.absolute.dir}/${source.dir}"
2012-01-24
Fedora 11 to 16
概要
takke.jp 等を収容しているサーバの OS アップグレード作業を実施しました。
つまり、
- Fedora 11 => 12
- Fedora 12 => 13
- Fedora 13 => 14
- Fedora 14 => 15
- Fedora 15 => 16
という作業を行いました。
それぞれ下記の所要時間でした。
- Fedora 11 => 12 2012/01/23 21:30 〜 23:30
- Fedora 12 => 13 2012/01/23 23:30 〜 01:30
- Fedora 13 => 14 2012/01/24 01:30 〜 08:30
- Fedora 14 => 15 2012/01/24 08:30 〜 11:00
- Fedora 15 => 16 2012/01/24 11:00 〜 12:30
はまりポイント
13 => 14 は preupgrade-cli で、それ以外は yum upgrade で実施しました。
【レビュー】Fedora 13から14へアップグレードする方法 | エンタープライズ | マイナビニュース
アップグレード自体は 2008/11 に Fedora Core 3 => 9 を、2010/2 に Fedora 9 => 11 を実施済みで慣れたものですが、如何せん太平洋の向こう側にあるサーバなので再起動が返ってこなかったときを思うと心拍数が少し上がっちゃいますね。
特に Fedora 13 => 14 の preupgrade-cli は再起動後にコンソールからカーネル選択&固定IPアドレス設定が必要で、現地作業を依頼しなければいけないなど、かなり大変な思いをしました。サーバ死んだかと思いました…。
なので 14 => 15, 15 => 16 は従来の yum upgrade に戻しました。
今回は Fedora 11 => 12 のタイミングで PHP が 5.2 => 5.3 にバージョンアップしたため、いくつかのサイトが動作しなくなり、依存している Simplate のバージョンアップを行いました。
Fedora 12 => 13 のタイミングでは
Fedora12からFedora13へのアップグレードをyumで行うのは危険 - tototoshiの日記 や
Fedora12 -> Fedora13 へのアップグレード - Kerosoft : Modus Operandi
にあるように注意が必要とのことで慎重に行いましたが、GUIログインではないので無関係だったようです。
systemd への移行
Fedora 14 => 15 のタイミングで crond が自動起動しなくなりました。
service (SysV) が systemd に置き換わっているためですね。
Fedora 16 まで入った時点で下記コマンドで導入しました。
# systemctl enable crond.service # systemctl start crond.service
同様に、httpd や mysqld も。
# systemctl enable httpd.service # systemctl start httpd.service
# systemctl enable mysqld.service # systemctl start mysqld.service
これからは systemd 系に慣れていかないといかんのですね。
主要パッケージのバージョン
今回の OS アップグレードにより主要なパッケージのバージョンは下記のように変化しました。
いずれも yum upgrade 完了時のバージョンです。
| fedora | Kernel | Apache | Perl | PHP | APC | MySQL |
| 11 | 2.6.30 | 2.2.15 | 5.10.0 | 5.2.13 | 3.0.19 | 5.1.47 |
| 12 | 2.6.32 | 2.2.15 | 5.10.0 | 5.3.3 | 3.1.4 | 5.1.47 |
| 13 | 2.6.34 | 2.2.17 | 5.10.1 | 5.3.6 | 3.1.6 | 5.1.56 |
| 14 | 2.6.35 | 2.2.17 | 5.12.4 | 5.3.8 | 3.1.9 | 5.1.60 |
| 15 | 2.6.41 | 2.2.21 | 5.12.4 | 5.3.8 | 3.1.9 | 5.5.19 |
| 16 | 3.1.9 | 2.2.21 | 5.14.2 | 5.3.9 | 3.1.9 | 5.5.19 |
いずれにしても今回は preupgrade に振り回されました。いい勉強になりました。。。
2012-01-19
年末に導入したTVキャプチャ
DT-F110/U2 っていう製品。
コレ系のパーツはソフトウェアがイケテナイと何度も何度も聞いていたけど、正直ここまで酷いとは思わなかった。
別に製品自体は悪くないし、ごにょっとした用途に使うつもりもないからダビング10で十分で、画質も個人的にはこだわりもないことから十分満足していた。
が、まず、「番組表から予約する」というHDDレコーダーでは初歩の初歩、最初の機能すら実現できない。G-Guideなんちゃらっていうアプリが付いてたけどちゃんと動いたのは最初の数日間だけ。あとは取得中にプログレスバーが止まってそのまま起動すらしなくなった。
今時点で他のチャンネルに変えたいとき。PCastTV3 というアプリ内で「チャンネル一覧」が文字情報として表示されて、そこから選局する、というのがごく自然なUIだと思うんだけど、、、無い。
現在のチャネルの時間的に後方の番組表は表示される。他のチャンネルに選局もできる。で、見たい局が決まった。さあ見ようと思って右クリックしたら「予約」しかないのwww
今見たいんですけど!
ハードウェアとしてはmini B-CASカードリーダーとアンテナコネクタくらいなもので、もうほとんどソフトウェア勝負の世界だろうコレって思うのに、ユーザー目線でソフトウェアが作り込まれていないのは本当にがっかりする。
やっぱりこういう世界はフリーソフトでがっつり補完するしかないんだろうな。
まず地デジで見たいコンテンツがほとんどないというのもあるけどそれはまた別の話。
様々な制約の中で、限られたリソースの中で作られているというのは分かるのでクレームじみたことは言いたくないんですけどね。同じソフトウェア屋さんとして気になったので。常にユーザー目線でアプリを作っていきたいですね。
2012-01-11
Androidで使える英語TTS(Text-to-Speech)エンジン一覧
Android用の音声再生エンジンとしては標準で Pico TTS がインストールされています。一部、IS03 のように端末容量の関係でデフォルトで未インストールの機種もあるようです。
面白いのはこれらの機種に Pico TTS を導入するとアンインストールできないところ。
Pico TTS は昔ながらの音声再生エンジンといった発音で、お世辞にも「ネイティブっぽい」とは言えません。そこで、先日の記事( Android用TTSエンジンについて - 某ソフト作者の開発日記)のように別のエンジンを入れたいのですが、いい感じのエンジンがどれなのかよく分からないですよね。
日本語で得られる情報もかなり限られているので少しまとめておきます。
# Android用の英単語アプリは数あるのになんでTTS関連の情報が少ないんだろう。
Pico TTS の開発元でもある SVOX さん
エンジン+音声データの組み合わせでインストールする。
音声データは有料。2週間は全データが無料でお試しできるみたい。
音声データのサイズはUS音声で18MB程度。
先日も紹介した IVONA さん
エンジン+音声データの組み合わせ。こちらは今のところ無料。
音声データのサイズは500MB前後。非常に大きい。
他にも情報があればお待ちしております…。
----
参考:
2012-01-03
Android の WebView で特定のボタンが押せなくなる場合がある件
周知の通り Android の WebView はバージョン依存が酷く、クセがあります。少し油断するとコードはバッドノウハウの固まりになります。そんなネタの1つがあったのでご紹介します。
拙作の TkMixiViewer では Twitter 連携用 OAuth アクセストークンの取得時に WebView で認証画面を表示しています。具体的には [Android] Android+Twitter4JでOAuthするためのソースコード - adakoda を参考に実装しています。
ここで、「連携アプリを認証」ボタンを押すと、通常は WebViewClient.onPageStarted または WebViewClient.shouldOverrideUrlLoading が呼ばれ、URL遷移を判定し、特定のコールバックURLであれば認証成功と見なしてアクセストークンの取得を行うわけですが、どうにも WebViewClient のフック関数が呼ばれないケースがありました。
※おそらく普通に WebView を組み込んだだけのアプリでは発生しません。
具体的には、同アプリ内の別の Activity で WebView を含んでいて、かつその Activity を経由した場合にのみ、フック関数が呼ばれない(認証ボタンが押せない=押しても無反応になる)現象が発生しました。もう1つ加えると、Android 2.3 以降の端末でのみ発生していました。
※上記画像はエミュレータなので認証ボタンが "Authorize app" になっています。
- (A)トップページ ⇒ ボイスの投稿画面 ⇒ Twitter認証画面
- このパターンでは発生しない
- (B)トップページ ⇒ ボイス一覧画面(WebViewを含む) ⇒ ボイスの投稿画面(*) ⇒ Twitter認証画面
- このパターンでは発生する
上記 (*) の Activity では、WebView の暴走を防ぐ1つの仕掛けを組み込んでいました。
詳細は android - WebView threads never stop (WebViewCoreThread, CookieSyncManager, http[0-3]) - Stack Overflow にあるように、onWindowFocusChanged のタイミングで WebView の onPause/onResume をリフレクションで呼んでいます。内部タイマーも停止・再開していますね。
つまり、(B) の遷移パターンで (*) の Activity からTwitter認証画面(OAuthActivity)に遷移するタイミングで onWindowFocusChanged で WebView.onPause が行われるが、OAuthActivity では WebView.onResume を行っていないため、WebView 内部の動作が停止していたようで、ボタンを押しても反応しない状況となっていました。
OAuthActivity でも WebView.onPause/onResume の処理を加えることで無事、ボタン押下をハンドリングできるようになりました。
WebView の onPause/onResume すら行っていないアプリばかりだと思うので多くのアプリには関係ない話でしょうが、複数の Activity で WebView を持つアプリを作る場合には頭の片隅に置いておくと何かのときに役に立つかもー。
# 本当はもう一歩進んで Gingerbread の WebView のソースコード読むくらいのことしたほうがいいんでしょうけどそこまで体力がないので今日はこの辺で。。。



