スキップしてメイン コンテンツに移動

Android JUnit testかJUnit testかでログの出力先を切り替える

テスト駆動開発でコーディング、テスト、リファクタリングというサイクルを素早く回す必要があるのですが、Eclipse上のAndroidでやる場合Android JUnit testは端末へのインストール処理を挟むためどうしても起動が遅いです。

起動で一呼吸している間にモチベーションや集中がどっかへ行ってしまいます。そのため、極力ロジック部分を切り離して(Androidを含まない)JUnit testとして起動した方が光の速さで起動するので良いと思います。それに伴って、特に意識せずにAndroidとロジック部分の結合度も下がるというメリットもあります
※「特に意識せず」というのはAndroidのクラス利用しようとしてたらコンパイラが指摘するから

ただ問題なのがログですね。テスト対象のクラスに埋め込むandroid.util.LogのLog.v("tag", "message")という感じで使うLogcatに表示してくれるメソッドは、JUnit testで起動するとエラーが出ます。使えるようにする方法もあるのかもしれませんが、以下のようなやり方を思いついたので掲載しておきます。

Log.vの箇所に下記のようなクラスを利用します。システムプロパティの文字を判定して、Log.vかSystem.out.printlnかをif文で分岐させてるだけです。

import android.util.Log;

public class MyLog {

    private static String runtime =
        System.getProperty("java.runtime.name");

    public static void v(String tag, String msg) {

        if(0 <= runtime.indexOf("Android")) {
            Log.v(tag, msg);
        }
        else {
            System.out.println(tag + ":" + msg);
        }
    }
}

ちなみに、System.getProperty("java.runtime.name")の戻り値は、
  • Android JUnit test実行時 : Android Runtime
  • JUnit test実行時 : Java(TM) SE Runtime Environment
という文字列を返します。
まあ、でも結合テストや運用のログには中で分岐させてるのは好ましくないかもしれませんね。テスト駆動開発用ということで。

代替案として、Eclipseへ新たにJavaプロジェクトを追加して、そこでロジック部分をテスト駆動で実装する。テストが終わったら本プロジェクトにコピーしてやる。ログの部分は同じようにMyLogクラスを設け、双方同じ名前のパッケージ内入れてLog.v (本プロジェクト側)やSystem.out.println (新たに追加したプロジェクト側)で出力してやれば、テスト済みのクラスを本プロジェクトへコピーするだけでいけます。

追記:2013/12/27

>代替案として、Eclipseへ新たにJavaプロジェクトを追加して、そこでロジック部分をテスト駆動で実装
と書いてますが、代替案としてもやらない方がいいですね。Javaプロジェクトで動くものが、Androidで同じように動くとは限らないので。ライブラリとか使ってる場合とか。当たり前ですね.....

コメント

このブログの人気の投稿

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Eclipseの高速化メモ

Eclipseが重いと一言に言っても、いろいろな工程での話があると思いますが、過去記事のなども含めてこの記事にピックアップしておきたいと思います。以下はWindows環境での話です。