Androidテスト勉強会 9月8日(土) #atest_hack に行ってきた

Androidテスト勉強会 9月8日(土) #atest_hack on Zusaar
に行って来たのでその時のメモなど。

全体的にAndroidだからこうテスト書こう、よりもテストは何のためにやるのか、テストの種類とは、みたいな一般化したお話が多かった印象。
あとGroovy使いが多かった。Gradle興味あるので触ってみようかなぁ
スライド内でも紹介されていたけど、Androidのテストについては
連載インデックス「Androidアプリ開発テスト入門」 - @IT
こちらを見るといいと思う。

以下会場で取ったメモ。後半あんまり取れてない…。

ソフトウェアテストな人同士で合わせておきたい5つの概念

@snskさん(しんすくさん(Androidテスト部))

品質とは
  品質それ単体では何もいってないよね
  品質モデル
    PQM Lite
      機能実装度合い
      セキュリティ、プライバシー
      信頼性
      覚えやすさと気持ちよさ
      時間と資源のパフォーマンス
      変更のしやすさ ←これがデベロッパテストで担保すべき場所
      スケーラビリティ

テスト技術とプロセス品質技術
  テスト技術→成果物を知るための技術
  プロセス品質技術→プロセス自体の成熟度を知る技術
    プロセス自体です。設計レビューの時間とか

テストレベル
  Vモデル
    要求      : 受け入れテスト
    基本設計  : シナリオテスト
    詳細設計  : 結合テスト
    実装      : コンポーネントテスト
  NativeDriverいちおし

自動化ツール
  受け入れ、シナリオテストの話!
    自動化で削減出来るもの
      →実行工数のみ
    初期の投資コストは手動より高くつくよね
    メンテコストは手動とほぼ同様だよね
    コスト的に手動<自動となるのは、3回以上実行するもの
  コンポーネントテストは自動化普通だよね?

誰がためのテストか
  仕事として?
  顧客のため?
  自分(将来)のため?

  将来作っていくことを考える場合
    変更のしやすさが超重要!!
      →分厚いドキュメントをかく()
      →Unittestをかく

テストは知る技術 →技術がいる
既知のものを調べるのはチェック

Sue445 Style TDD

@sue445 さん (AZusaar!の中の人。TDDクラスタ(他多数)代表)

Sue445 Style TDD #atest_hack

Junit実践入門にAndroidのテストもかかれてるよ!

テストの種類
  QA testing
    セキュリティ、バグとか
  Developer testing
    開発促進(TDD)はここ
  customer testing
    使いやすさとか? //todo あとでみる

TDDは設計だよ!

1.テストファースト
2.Redにする
3.実装する
4.Greenにする
5.テストが動くままでリファクタリング
  黄金の回転!

Clean Codeの Martinいわく
TDD三原則
  テストファースト
  失敗するテストを書くまでは次のテストは書かない
  失敗するテストがある限り次のプロダクトコードは書かない

テストファーストの重要性
  テストを書くには何が必要なのか
    入力
    出力
    クラス、メソッドの責務。パターンわけなど
  →これって設計だよね
    作りたいものを明確にしてからじゃないといけない
    あやふやな仕様を明確にする→テストファーストによって
    赤→緑になるときもちいいよね!

TDDのための一般的な理由
  和田さんのスライドをみましょう
  健康のため
  素早くフィードバックをえる

  テストコードのリファクタリングは?
    同じテストコードが複数出てきたらし始める感じ

ソフトウェアテスト入門

@sassy_watson さん (Androidテスト部)

テスト初心者Androiderのためのソフトウェアテスト入門

テーマ
  テストの種類について
  テスト技法について

何をテストしたいかを把握するためのテストの種類を明確にする
V字モデルに基づいて
  要件定義
    やりたいことを明確にする
  基本設計
    画面などの基本的な設計
  詳細設計
    実装のための設計(シーケンス図とかクラス図とか)
  実装
    実装

  ざっくり分類
    プログラムで確認するテスト
      ・単体テスト
        JUnitとかで確認するよ
        細かい単位でテスト
          直流の電球回路で1個ずつテストしたらつなげてもつくことがわかるよね
        他のモジュールに依存するユニットテストをするには
          他モジュールが何を返すのかわからん→Mockを使いましょう!
          android.test.mockパッケージのクラスを使ってテストできる
            overrideしないと基本的にExceptionをはく
          android-mockというフレームワークもある

      ・結合テスト
        androidだとユニットテスト結合テストの境界が曖昧
          他のActivityに依存したりが多いから
          Androidだとユニットテストしづらいから結合テストでがんばるのもアリ

    実機で確認するテスト
      システムテスト
        仕様通りに動くかどうかのテスト
        仕様書からテストケースを抽出する必要があり
        機能だけでなくて、Performance、Securityとかの非機能要件も考慮する必要があるよ
      受け入れテスト
        主にお客様が自分たちの要求を満たしているかを確認するテスト

テスト技法について
テストを効率的にするにはどうすればいいのか
  →テスト技法を用いてテストしよう!

よりよりテストとは
  多くのバグを発見
  少ない時間で発見

代表的なもの
  同値分割
    類似値をグルーピングしてそれらが同じ値がかえるか
      →1とか3とか5とかの値を入れても同じ値が返ってくる
      →グループの代表値のみ入れてテストの数を減らす
  境界値分析
    同値分割(グルーピング)した境界値に注目
    境界値はバグが出やすい
      255文字入力出来るEditTextの場合:
      →0とか−1とか1とか255とか256とか
  デシジョンテーブルテスト
    入力と出力の関係表を元にしたテスト

  他のテスト技法
    状態遷移テスト
    原因結果テストなど…

  テスト技法ポジションマップ
    テスト技法について、これはどのへんに効果的だよとかの図。よさそう

  マインドマップからはじめるソフトウェアテスト
    上層の話になるかも
    テスト設計の勉強に
  ソフトウェアテスト技法ドリル
    テスト技法をドリル形式で
    テスト設計の勉強に
  Androidならテスト部の記事を!

テストはあくまでもバグを出すための手段であり、
テスト=目的となってはいけない
品質/コスト/納期とかのバランスを考えよう

GroovyなAndroidテスト

@alterakey さん (埼玉支部・デ部 「炎のAndroid開発道場」の著者の一人 android-runner開発者)

GroovyなAndroidテスト #atest_hack

標準のAndroid testing frameworkは遅い
そこでGroovy!
  privateメソッド呼べるし

Androidだと簡単に使えない
  Discobotとか実績あり?

  JVMのテストならOK!

JVMでテストとは
  Robolectric
  AndroidアプリをJVMでテストするためのフレームワーク

  Android ant runner
    antのみ現在は
    EclipseとかIDEとかは・・・
    Unix限定

そもそもテストとは
  テストとは設計手段である

Robolectricはパラメタライズドテストが使えない
Robolectricを使わなければパラメタライズドテストできるけど

//詳しくはスライドを見る。内容濃い

実務に近いテストコードを書いてみる

@kimukou2628 さん (Androidテスト部)

Try_to_writecode_practicaltest #atest_hack

テストってググり駆動できないよね

昔はWebページの広告枠をかう→いまはアプリの枠を買う
  Mediationが注目

端末ごとのハマりポイントなど
  //スライドにまとまっている。いい内容。あとGalaxy Nexus安定

iPhoneでのunit test

@mike_neck さん (Androidテスト部)

i-Phone unit-test

obj-cでどうやってテストをしながらアプリを実装していくか
アプリが持つ要素を洗い出す

テストをする前に何がテスト出来るか、をモデルの取り得る値を洗い出す

プロジェクトを作るときはinclude unit testにチェックを入れること!
  →入れないとプロジェクトのxmlをゴリゴリしないとだめ。めんどい

Twitter4jとテスト (タイトル変更された模様)

@yusuke さん (Twitter4J開発者。「Twitter APIポケットリファレンス」著者)

Twitter4Jとテスト

Twitte4jの開発、テスト環境について
環境
  IDEA/maven/jenkins/jira/github/sonatype

Android環境の自動テスト
  Android Emulator Plugin

Twitter4jとテスト
  まずAPIとの疎通確認
  アナウンス無しに仕様変更になる場合がある
    →テストが必要(CI)

  Twitte4jを使うアプリケーションでは
    Twitter4jがやってくれることはテストしないよ
      パラメータ、レスポンスの型
      APIコール失敗時のリトライ
    ビジネスロジックは必要
      正常系はあまり問題ない
      異常系
        ↓が同じ状況を作り出すのが面倒
        twitterが落ちてるとか
        レートリミットに到達した場合のテスト

  メトリクス分析から見るソフトウェア品質の本
    データ指向のソフトウェア品質マネジメント

  テストは動的な品質向上・担保の手段
  静的な手段としては
    コンパイラ
    静的解析
    コードメトリクス
  外部APIとかと接続する箇所は仕様に頼り過ぎない
    →Twitter API1.1で廃止予定のメソッドが今は呼べたり、OAuth無しでいけたり
    →ドキュメントが追いついていないとか

テストケースの失敗について
  たまたま失敗しているのか→そのままでいいよね
  継続的に失敗しているのか→対策しないとやばい
    jenkinsでテストしている場合はテストごとのageで何回連続でテスト失敗しているかが分かる

  jenkinsのテスト結果を待って次の作業は効率悪いので、テスト中に別のことをやり始める

  異常系テストはMockを使う