2014/12/30

Android:Calabash for Android 導入

はじめに

Calabash for Androidは, Ruby製のビヘイビア駆動開発(BDD:Behaviour Driven Development)ツール Cucumberを使ってAndroidアプリをテストできるライブラリ.
Rubyのパッケージ管理システムgemでインストールできる.

今回の確認環境は次の通り.

  • Mac OSX Mavericks 10.9.5
  • RVM version 1.26.7
  • Ruby 2.2.0p0

準備

Rubyの環境を整えるためにHomebrewをインストールする

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewが正しくインストールされたかをチェック. エラーが出た場合はメッセージに従う

brew doctor

RVMをインストールする

\curl -sSL https://get.rvm.io | bash -s stable

PATHを設定するために.bashをリロード

source ~/.bash_profile

RVMのバージョンを確認

rvm version

Rubyの最新バージョンを確認

rvm list known

Ruvyの最新バージョンをインストールし, デフォルトに設定する.

rvm install ruby-2.2.0 --default

PATHを設定するために.bashをリロード

source ~/.bash_profile

Rubyのバージョンを確認

ruby -v

Rubyのインストールロケーションを確認

which ruby

Calabash for Androidのインストール

gem install calabash-android

AndroidSDKのパスをANDROID_HOME環境変数で定義

// .bash_profileに下記を追記
export ANDROID_HOME=[AndroidSDKへのパス]

PATHを設定するために.bashをリロード

source ~/.bash_profile

ANDROID_HOMEが正しく設定できているか確認

echo $ANDROID_HOME

テスト対象のAndroidプロジェクトに移動.
AndroidManifest.xmlがあるディレクトリに移動し下記コマンドを実行.

calabash-android gen

genによりcucumberのスケルトンが作成される(作成される各種ファイルについては後述)

calabashテスト実行時にインストールされるテストアプリに付与する署名を指定する.
この署名はテスト対象のアプリと同じ署名とする. 署名の指定は次のコマンドで行う.

# 実行するとカレントディレクトリに.calabash_settingファイルが生成される
calabash-android setup

テストを実行するには同階層で下記コマンドを実行する.

calabash-android run [テスト対象のapk]

実行するとテストが実行される.
cucumberが途中で上手く動作しない場合は-vオプションを付与することで詳細なログが出力される.

NOTE
calabash-android gen, calabash-android setup, calabash-android runはAndroidManifest.xmlと同階層で実行する.

参考

2014/12/27

Android:Findbugs

はじめに

FindBugsは次の機能を持つ静的検査ツールである.

  • Javaクラスバイナリに対する解析によりバグパターンの検査を行う
  • 解析結果を出力する

FindBugsはJavaクラスバイナリからバグパターンを解析するプログラム. ソースコードリポジトリへのコミット前後でFindBugsによるコード解析を行い, 潜在的な不具合を排除するツールとして非常に強力である.

Javaソースコードを解析したい場合はPMDが利用できる. 実動作により近いクラスバイナリを検査するという点ではFindBugsが有利であるが, ソースコード自体の品質を向上させたい場合はPMDやLintを使用する.
Groovyコードは同じくクラスコードを生成するがFindBugsによる正しい検査はできない.

また, 解析結果を出力する機能もあり, 各種CIツールとの親和性も高い.

FindBugsの動作環境

  • プラットフォーム非依存(GNU/Linux, MacOS X, Windows可)
  • J2SE 1.5以上のランタイムが必要
  • メモリ512MB以上が必要で, 解析対象が巨大である程これは増加する

FindBugs GUI

FindBugsはそれ単体をプログラムとして配布されている.
http://findbugs.sourceforge.net/ja/manual/installing.html#d0e94

FindBugsを単体実行するGUIツールも用意されているが, 昨今ではIDEアプリケーションのプラグインとして導入・実行されるケースが主であるためここでは割愛する.
http://findbugs.sourceforge.net/ja/manual/gui.html

Bug Pattern

下記ページに日本語訳(FindBugsv2.0.2)が纏められている.
http://www.acroquest.co.jp/webworkshop/JavaTroubleshooting/findbugs/

FindBugsを実行する際にはこれらのBug Patternを検査項目としてインプットする.
プロジェクトの特性に合わせて検査項目はフィルタされることもある.

Analysis Properties

FindBugsがソース解析する際の観点を分析プロパティとして実行時に指定することができる.
分析プロパティには主に次の2点を指定する.

  • 分析対象のメソッドの意味
  • 分析の精度

1点目, 分析対象メソッドの意味を指定することでより正確な分析結果を得ることができ, 誤検出を減らすことができる.
2点目, FindBugsが消費するメモリや分析時間が問題となる場合は精度を落とすことで解決できる場合がある. ただし, 検出されるべきバグを見逃す可能性が高くなるデメリットもある.

分析プロパティは-propertyで指定する. 次はその例.

$ findbugs -textui -property "cfg.noprune=true" myApp.jar

-propertyで指定できる分析オプションの一覧は下記を参照.
http://findbugs.sourceforge.net/ja/manual/analysisprops.html

FindBugs Plug-in

IntelliJ IDEA系 IDEにFindBugsを導入する場合は FindBugs-IDEA プラグインが便利.
https://plugins.jetbrains.com/plugin/3847?pr=idea

FindBugsは日本語情報も充実しており, Webで検索すればいくらでも見つけることができる.

CIツールでFindBugsを自動実行させたい場合, Gradleには標準でFindBugs-pluginが用意されている.
http://gradle.monochromeroad.com/docs/userguide/findbugs_plugin.html

NOTE
上記GradleのFindBugsプラグインはjavaプラグインと併用されることを前提としている.
Androidプロジェクトで作成されるbuild.gradleにはjavaプラグインが適用されないため, FindBugsプラグインを動作させるには少し工夫する必要がある.

次のgroovyコードをbuild.gradleに適用するとfindbugsタスクが追加され, Gradle consoleからfindbugsを実行することができるようになる.

apply plugin: 'findbugs'

task findbugs(type: FindBugs) {
    ignoreFailures = true
    classes = fileTree('build/intermediates/classes/debug/')
    source = fileTree('src/main/java/')
    classpath = files()
    effort = 'max'
}
tasks.withType(FindBugs) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}

参考

以上.

2014/12/26

Android:Lint

はじめに

Android LintはAndroidプロジェクトの潜在的不具合を検出するための支援プログラムである.
Android Lintでは次のようなAndroidに特化した問題を検出することができる.

  • 多言語化対応の不足 (翻訳されていない, るいは利用されていない文言)
  • レイアウトパフォーマンスの問題(旧layoutopt toolで検出されていたもの+α)
  • 未使用リソース
  • iconに関する問題(densityの間違いや間違ったサイズ etc…)
  • AndroidManifest関連のエラー
  • などなど他多数

Android Lintは単独動作できるコンポーネントでありCIツールとの連携が望まれている.
Lintのチェックリストは随時更新されており, Android SDK toolsとして配布されている.
検査結果をレポートすることもできる.

Android Lintの検査内容

Android SDK toolsに同梱されているlintバイナリに--showコマンドを発行すれば検査内容の一覧を確認できる.

$ lint --show

各検査項目にはPriority, Severity, Categoryが設定されている.

Priority
1~10(max:10). 問題の優先度.

Severity
Warning, Error, Fatal. 問題の重要度.

Category
Performance, Usability, Correctness, Security etc… 問題の種類.

Android Lintによる検査はリリースビルドを実行した際に自動実行される.
ここでは致命的なエラーのみを対象に検査され, 問題があった場合はビルドを中止する.

GradleのlintOptionでこれを停止することもできる.

android {
    lintOptions {
        abortOnError false
    }
}

Android Lintの実行

Android StudioであればGradleのタスクとしてlintが標準で作成されている.
GradleでAndroid Lintの挙動を制御したい場合は次のオプションを指定できる.

android {
    lintOptions {
        // set to true to turn off analysis progress reporting by lint
        quiet true
        // if true, stop the gradle build if errors are found
        abortOnError false
        // if true, only report errors
        ignoreWarnings true
        // if true, emit full/absolute paths to files with errors (true by default)
        absolutePaths true
        // if true, check all issues, including those that are off by default
        checkAllWarnings true
        // if true, treat all warnings as errors
        warningsAsErrors true
        // turn off checking the given issue ids
        disable 'TypographyFractions','TypographyQuotes'
        // turn on the given issue ids
        enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
        // check *only* the given issue ids
        check 'NewApi', 'InlinedApi'
        // if true, dont include source code lines in the error output
        noLines true
        // if true, show all locations for an error, do not truncate lists, etc.
        showAll true
        // Fallback lint configuration (default severities, etc.)
        lintConfig file("default-lint.xml")
        // if true, generate a text report of issues (false by default)
        textReport true
        // location to write the output; can be a file or 'stdout'
        textOutput 'stdout'
        // if true, generate an XML report for use by for example Jenkins
        xmlReport false
        // file to write report to (if not specified, defaults to lint-results.xml)
        xmlOutput file("lint-report.xml")
        // if true, generate an HTML report (with issue explanations, sourcecode, etc)
        htmlReport true
        // optional path to report (default will be lint-results.html in the builddir)
        htmlOutput file("lint-report.html")

        // set to true to have all release builds run lint on issues with severity=fatal
        // and abort the build (controlled by abortOnError above) if fatal issues are found
        checkReleaseBuilds true
        // Set the severity of the given issues to fatal (which means they will be
        // checked during release builds (even if the lint target is not included)
        fatal 'NewApi', 'InlineApi'
        // Set the severity of the given issues to error
        error 'Wakelock', 'TextViewEdits'
        // Set the severity of the given issues to warning
        warning 'ResourceAsColor'
        // Set the severity of the given issues to ignore (same as disabling the check)
        ignore 'TypographyQuotes'
    }
}

参考