- SlideBoom

第1回 Andoird テスト祭り
尾上 雅則
Agenda
1. テストの価値向上再考
2. Android/iOS開発で推奨されるUI設計パターン
3. Presentation Modelパターン
4. UI設計パターン実践時の注意点
5. まとめ- Androidコミュニティとテストと設計パターン
6. 自己紹介(え
ユーザーインターフェースのテストは難しい
1.テストの価値向上再考
UIテスト
 UIのテストは、目視による確認が基本。
→ テスト結果の自動確認
ができない
→ 完全な自動リグレッション
テストが構築できない
→1テストの価値を向上させると
いうアプローチはとれる
1.テストの価値向上再考
テストの価値向上のための責務分割
 適切な責務分割は1テストの価値を上げる。
 例えば27個のユースケース
ユースケース1
ユースケース2
27個のユースケース
ユースケース3
27個のテストケース
ユースケース4
ユースケース5
1.テストの価値向上再考
テストの価値向上のための責務分割
 適切な責務分割は1テストの価値を上げる。
 例えば27個のユースケース
A
D
G
B
E
H
C
F
I
27個のユースケースが、
3 × 3 × 3の機能で成り立っていたら・・・
1.テストの価値向上再考
テストの価値向上のための責務分割
全く責務分割されていない27つのユース
ケースのテストと比較すると、コードが減
り、品質・テストの質が向上しやすい
A
D
G
B
E
H
A~Iまでの9個のテストで
C
I
F
単体レベルのテストが可能に!
1.テストの価値向上再考
テストの価値向上のための責務分割
また適切に責務分割されていればいるほど、
単一責任の原則が守られているという事な
ので、適切なテストケースを導出しやすく。
A
D
G
B
E
H
C
F
I
1.テストの価値向上再考
テストの価値向上のための責務分割
結合してのテストを考えても、単体テスト
の価値が向上しているため、バグを修正す
る際、修正の連鎖やそもそもバグが減少
A
D
G
B
E
H
C
F
I
1.テストの価値向上再考
テストの価値向上のための責務分割
責務分割がもたらすのはもちろんテストの
価値向上だけではない。
 変更に強く
 コードの見通しがよく
 再利用性が向上し、
 開発の分担もしやしく
1.テストの価値向上再考
テストの価値向上のための責務分割
ではどう責務分割していくか?
先人たちのベストプラクティスの形として、
各種設計パターンが存在します。
そしてもちろんAndroid開発においても、
推奨されるパターンが存在します。
Android/iOSには共通で推奨されるパターンがあります
2.Andoird/iOSで推奨されるGUI設計パターン
MVC ( MVP )
 Model – View - Controller
 Model – View – Presenter
 使い古され、
 枯れたといわれ、
 亜種だらけでMVCという名前に共通認識がなく、
 しかしGUIアプリを作成する上で決して無視で
きないパターンです。
その目的は、
プレゼンテーションロジックとドメインロジック
の分離
2.Android/iOSで推奨されるGUI設計パターン
MVC ( MVP )
GUIアプリの責務分割を考える上で、
誰もが考えるのが、
アプリケーションの見た目と操作に関わる部分と、
(プレゼンテーションロジック)
アプリを作る動機でもあった解決したい問題領域に関
わるコード
(ドメインロジック)
の分離。そしてそれはMVC系パターンの大目的です。
2.Android/iOSで推奨されるGUI設計パターン
MVC
Controller
View
Model
⑥変更(⑤が変更依頼な時のみ)
2.Android/iOSで推奨されるGUI設計パターン
MVC
Controller
ViewとConrollerが
プレゼンテーションロジック
を担当
View
View: UIの外観制御
Controller:
入力と通知の橋渡し
Model
Model:ドメインロジック
2.Android/iOSで推奨されるGUI設計パターン
MVCがテストにもたらす価値
ModelとControllerはともにコードがINとOUTになり、
自動テスト可能になります。
Viewは
ユーザアクション
View
Controllerから
上記2種類の契機(トリガー)をもって、
自身の状態を変化(アクション)させるだけの
オブジェクトと捉えられる
自動テスト可能な範囲が増えた!
MVC系派生パターンの一つです。
3.Prensentation Modelパターン
Presentation Modelパターンの紹介
 MVC派生パターンのひとつ
View
Presentation
Model
Model
監視
ViewはPresentation Modelを
レンダリングするだけの存在
Viewを変更したい時はPresentation Modelを変
更する事でViewが変更されるという形が理想
3.Prensentation Modelパターン
Presentation Modelパターンの紹介
Presentation
View
ViewとPresentation
Model
Model
Modelの同期実装
監視
コスト高そうって思いますよね?
ViewはPresentation
Modelを
レンダリングするだけの存在
Viewを変更したい時はPresentation Modelを変
更する事でViewが変更されるという形が理想
3.Prensentation Modelパターン
android-binding
 ProjectHome: http://code.google.com/p/android-binding/
 CodeProject: http://www.codeproject.com/KB/android/androidbinding.aspx
 日本語情報 @nakajiさんのブログ
 Android Bindingを使ってみた(1)~(3)
 http://d.hatena.ne.jp/nakaji999/20110616/1308236700
Android-binding はAndroid用
データバインディング機構
3.Prensentation Modelパターン
android-binding
View側
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=“Calc"
binding:onClick="Calculate"/>
<TextView android:id="@+id/b"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
binding:text="BMI"/>
3.Prensentation Modelパターン
android-binding
PresentationModel側
public void Calculate() {…};
public void setBMI(double bmi)
{…
//変更通知
notifyPropertyChanged(“BMI”);}
public String getBMI() {return …}
3.Prensentation Modelパターン
android-binding
Android-bindingの使用により、
Viewは
POJOなPrensentationModelのレンダリング
とすることができる。
PresentationModelの状態がViewの状態を決定
3.Prensentation Modelパターン
android-bindingを使用したPMパターン
Viewからの入力を伝える
(バインディングは単方向なので)
Controller
(Activity)
Presentation
Model
View
バインディング
Model
監視
3.Prensentation Modelパターン
android-bindingを使用したPMパターン
PresentationModelはUIの状態ストアだ
から、画面内で動的に変化するすべての情
報を含みます。
Viewからの入力を伝える
(バインディングは単方向なので)
• チェックボックスがチェックされている
Controller
か否か
(Activity)
• クリックされたときのボタンの背景色
• 表示されているリストの各項目
Presentation
View
Model
バインディング
Model
監視
など。
3.Prensentation Modelパターン
PMパターンがテストにもたらす価値
MVCより、Viewの一部がさらに自動テスト可能な状
態に置き換わっている。
MVCで言うViewからViewが保持している状態が分
離された!
POJOなので、実機・エミュレータなどがなくても自
動テスト可能に。
また、表示の反映ロジックがバインディング機構の
中に隠蔽されたため、ユーザーコードが減り、テス
トで個々に検証するべきコードも減った。
3.Prensentation Modelパターン
Presentation Modelパターン補足
PMパターンはandroid-bindingのような機構が存
在して初めて成立するパターン。ないと冗長過。
つまり、プラットフォームや使用ライブラリの機能によって
大きく形が異なり、ViewとPresentationModel間の責務も揺
らいだりする。
WPF/Silverlight(Windows Phone7含)では、PMパターンは
MVVM(Model – View - ViewModel)パターン
と呼ばれます。
MVVMではViewModel(PM)にボタンの色まで持ったりしない。
(Viewを記述するDSL性能・バインディングが双方向)
UIパターンで実践時にはまりやすいところのご紹介
MVCかPMか、とかに依りません
4.UIパターン実践時のはまり所
Webから来た人が3層にだまされる
 Web開発経験者の中には3層というだけで、こんな
形にしちゃう人がいます。
 AndoridじゃMVCもPMも一見3層なので注意が必要。
画面
ビジネス
ロジック
データ
アクセス
プレゼンとドメインの分離ができていません。
真ん中は実際は画面制御もすることになりますね。
MVC系のそもそもの目的はどこに?
ビジネスロジックもデータアクセスもModelの中が適切
4.UIパターン実践時のはまり所
サーバと通信するアプリのModelは・・?
クライアント側はPresentationModelからという考え
View
Presentation
Model
Model
(サーバ)
通信ロジックとか、ユーザーIDとか管理するのは
PresentationModelなの?プレゼンとドメインが(ry
サーバとクライアントは違う目的を持つ違うアプリです。
Modelはほぼ必ずクライアント側にもある層ですよ。
4.UIパターン実践時のはまり所
(前提)ステートレス?ステートフル?
リッチクライアントはステートフル(状態を持つ)もの
でしょ?。Webみたいにリクエスト毎がオブジェクト
のライブサイクルじゃないです。
View
Presentation
Model
Model
この前提をしっかり認識していないと
次のページで紹介する罠が理解できず。。。
4.UIパターン実践時のはまり所
Modelはただのデータの入れ物?
ステートフルなModelがただのデータの入れ物という
考え。やはりWebからの人が(ry
View
Presentation
Model
Model
入れ物にデータを入れるのはどこの層なのよ?PM?
やはりビジネスとプレゼンの分離が(ry
リッチクライアントのModelは操作を持ちますし、自身の状態
を変化させたり、別のオブジェクトに変化を通知しますよ。
まとめ
5.AndoridコミュニティとテストとUI設計パターン
UI設計パターンがもたらす価値
MVC/PMなど問わず、
 設計パターンは、先人たちのベストプラクティス集
 ベストプラクティス = 責務分割のベストプラクティ
ス
 UI設計パターンの導入は適切な責務分割を推進する。
 適切な責務分割は、一般的なメリットの他に、テス
トの価値を高める。
5.AndoridコミュニティとテストとUI設計パターン
UI設計パターンの利用
 パターンは育つ!
 ベストプラクティスは成長する
 たとえばandroid – bindingで双方向バイ
ンディングが実現したら?
 さらにユーザーコードが減り、テストの
価値も上がる。
5.AndoridコミュニティとテストとUI設計パターン
コミュニティとパターン
 ベストプラクティスの共有
 コミュニティ
 ちょっと触って使えないとか言わない
 フィードバックして成長させる。
 代替パターンを提案してもよい
 次回はもっと効率的な開発ができる。
 コミュニティが開発者を幸せにする。
なぜか最後に自己紹介
 ちょっと反応が怖くて最後にさせていただきました。
 尾上 雅則(おのうえ まさのり)
 27歳
 .NET(C#/VB.NET)専門のフリーランス7年目。
 ここ2年間、WPF/Silverlight用のPMパターン、
MVVMパターンを中心に追い、コミュニティ活動も
MVVM絡みがほとんど。
 Blog : the sea of fertility – http://ugaya40.net
 Twitter:@ugaya40