際際滷

際際滷Share a Scribd company logo
Androidテスティングg樹
曠罐縫奪肇謄好?CI
云スライドは、NTTソフトウェア芙坪室g宀圄撹冩俐┘愁侫筏冩俐テキストです。
‐广恬?窒並/
? 云セミナ`コ`スの坪否、云Y創のすべての广恬悗蓮NTTソフトウェア幄塀氏芙に「奉します。
? o僅での云Y創の}亟、}u、壅旋喘、d、喘を鋤じます。
? 云Y創と處吉で旋喘するすべての縮可は、NTTソフトウェア幄塀氏芙からの隠^なしに戻工されます。
? 云にdされている氏芙兆およびu瞳兆は、匯違に光芙の斌砲泙燭狼賠h斌砲任后
Copyright ? 2016, NTT Software Corporation. 120
☆ 處}にvするスライドは、匯何を茅き、云ファイルには根まれておりません。
また、處に駅勣なソ`スコ`ドも根まれておりません。ご阻覚ください。
3. ユニットテスト徭啝
? ユニットテストについて
? ツ`ルの古勣
? ユニットテスト徭啝で寄並なこと
? プロダクトコ`ドのテスト否叟來
? 仝レガシ`コ`ド々個鋲
121Copyright ? 2016, NTT Software Corporation.
Copyright ? 2016, NTT Software Corporation. 122
ユニットテストについて
ユニットテストとは(1/2)
?了崔原け
?_k宀が芦伉するためのテスト(Developer Test)
?プロダクトがデグレしないようにするためのセ`フティネット
?瞳|鯢呂砲麓柘襪垢襪、瞳|隠^が及匯朕議ではない
?くタイミング
?プロダクトコ`ドをきながらテストもく
プロダクトコ`ド頼撹瘁ではない
?テスト
?ビジネスロジック
?_k宀がg廾していて音芦なところ
?鮫中(GUI)のYは麝發箸垢襪海箸謹い
123Copyright ? 2016, NTT Software Corporation.
ユニットテストとは(2/2)
テストを撹孔彜Bにしたままリファクタリングする
テストを払,ら撹孔に篁させるようにテスト鵐芥`ドをく
テストを払,気擦襯謄好肇芥`ドを弖紗する
テストを払,ら撹孔に篁させるようにテスト鵐芥`ドをく
払,垢襯謄好肇芥`ドをく
Copyright ? 2016, NTT Software Corporation. 124
?(歌深)TDD (テストl嚔_k)について
http://www.atmarkit.co.jp/ait/articles/1403/05/news035.html
プロダクトコ`ドの仝テスト否叟來々
テスト否叟來愁謄好箸き叟いプロダクトコ`ド
?テストしたいロジックはActivityにかない
?(停兆)坪何クラス鋤峭
?リスナやAsyncTaskは噸宥のクラスにする。
駅勣なものはコンストラクタで鞭け函れば措い。
?テスト喘にフィ`ルドを餓し紋えられるように
?仝パッケ`ジプライベ`ト々なsetterやコンストラクタを
駅勣に鬉犬酉智癲
?テストrにoverrideしたいメソッドをパッケ`ジプライベ`トに。
?仝云栖privateだがテストコ`ドからはアクセスさせたいもの々は
仝パッケ`ジプライベ`ト々で。
?テストはプロダクトと揖じパッケ`ジに崔く。
Copyright ? 2016, NTT Software Corporation. 125
仝レガシ`コ`ド々個鋲
レガシ`コ`ド  テストがoいコ`ド
テストがoく碧筝rに返がつけられないコ`ド
?レガシ`コ`ド個鋲
?徭咼罐縫奪肇謄好箸妊バ`してから個夛(筝)する
?そのままだとテストがけない栽
?テストがけるように、駅勣恷詰泙慮辻譴鬚垢
?デグレしないように、IDEのリファクタC嬬をl聞する
(返咾筝しない)
?フィ`ルド/メソッド/クラス弖紗やアクセス俐徨筝はOK
?歌深汐仝レガシ`コ`ド個鋲ガイド々
http://www.amazon.co.jp/dp/4798116831
126Copyright ? 2016, NTT Software Corporation.
Copyright ? 2016, NTT Software Corporation. 127
ツ`ルの古勣
? Robolectric
? Mockito
Robolectricの蒙
?Android鬚吋罐縫奪肇謄好肇侫讒`ムワ`ク
http://robolectric.org/
?MIT License
?Androidフレ`ムワ`クの嘛をJVMでエミュレ`ション
?APIレベル16から21をエミュレ`ト辛嬬(3.0井F壓)
?g佩堀業が堀い
?Mockitoとの穩辰辛嬬
?レい譴離┘潺絅讒`ションサポ`ト
?ビュ`の婢_、リソ`ス函誼、デ`タベ`ス荷恬、etc.
?とはいえ、JVM貧のエミュレ`ションに^ぎないことに廣吭
128
ビジネスロジックの編^がメインとなる
ユニットテストでは噴蛍聞える
Copyright ? 2016, NTT Software Corporation.
☆http://robolectric.org/ よりロゴを哈喘
Robolectricのコンセプト
?互堀にg佩できるLocal Unit Testの之泣
(Android Framework APIが聞えない)
をRobolectricが針捲
?ユニットテスト?TDDで嶷勣な
仝_kのリズムをpわないサクサクさ々
でAndroid APIがjんだ何蛍のテストg佩が辛嬬になる
129Copyright ? 2016, NTT Software Corporation.
local JVM (Java SE)
テストコ`ド
JUnitなど
Android Framework API
(腎g廾★Robolectric)
プロダクトコ`ド
Robolectricの児云議な聞い圭(1/3)
?児云はJUnit4
?テストランナ`を峺協する(@RunWithアノテ`ション)
?テストの念戻訳周を峺協する(@Configアノテ`ション)
?constantsの峺協は駅(Robolectricがgradleの秤鵑魑辰襪燭)
?その麿、エミュレ`トしたいAPIレベルの峺協なども辛嬬。
http://robolectric.org/configuring/
130
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
Copyright ? 2016, NTT Software Corporation.
Robolectricの児云議な聞い圭(2/3)
?@RunWithと@Configをまとめてくと
?ConfigはO協ファイルにいても措い(おすすめ!)
?ファイル兆:
src/test/resources/robolectric.properties
131
@Config(constants = BuildConfig.class)
@RunWith(RobolectricGradleTestRunner.class)
public class MyFirstRobolectricTest { .... }
constants=[パッケ`ジ兆].BuildConfig
Copyright ? 2016, NTT Software Corporation.
Robolectricの児云議な聞い圭(3/3)
?Shadowオブジェクト
?Androidフレ`ムワ`クAPIのg廾オブジェクト蛤
?Androidフレ`ムワ`クが戻工するクラスと1:1
?Shadowオブジェクトの聞いみち
?Androidフレ`ムワ`クでは戻工されていないAPIを戻工
?テストに嗤喘な坪何彜Bを岑るためのAPIが嶄伉
Copyright ? 2016, NTT Software Corporation. 132
ImageView iv = (ImageView) activity.findViewById(.....);
ShadowImageView shadow = Shadows.shadowOf(iv);
ImageViewに鬉垢Shadowオブジェクト
ShadowImageView shadow = Shadows.shadowOf(iv);
int resId = shadow.getImageResourceId();
云栖なら音辛嬬な
ImageViewの鮫颯螢秋`スIDにアクセス
Robolectricの崙淙瀧(1/2)
?Robolectric云悶の崙淙瀧
?3.0井:API Level 21 (Android 5.0)までサポ`ト
?3.1井:API Level 23 (Android 6.0)までサポ`ト
?targetSdkVersion=23では嘛させるためには、
參和のいずれかの鬉駅勣
☆ https://github.com/robolectric/robolectric/issues/1932 歌孚
?robolectric.propertiesに仝sdk=22々と弖する
?build.gradleのdependenciesに、參和を弖する。
testCompile 'org.khronos:opengl-api:gl1.1-android-2.1_r1'
☆compileSdkVersionとappcompat-v7のバ`ジョンは
揖じでなければならない泣に廣吭
133Copyright ? 2016, NTT Software Corporation.
Robolectricの崙淙瀧(2/2)
134Copyright ? 2016, NTT Software Corporation.
プロジェクトのbuild.gradleファイル
// (福待)
android {
// (福待)
compileSdkVersion 21
// (福待)
defaultConfig {
// (福待)
targetSdkVersion 21
// (福待)
}
// (福待)
}
dependencies {
compile 'com.android.support:appcompat-v7:21.
// (福待)
}
仟PJ恬撹rは恷仟verになっているの
でcompileSdkVersionに栽わせて俐屎
MockitoのB初
蒙
?クラス協xから、そのクラスのスタブを伏撹できる
?gオブジェクトの匯何メソッドの嘛を筝できる
?MIT License
URL
https://github.com/mockito/mockito (巷塀ホ`ムペ`ジ)
http://goo.gl/pOFyaQ (巷塀ドキュメント)
http://tech.cm55.com/wiki/mockito/Manual (晩云ZB初並)
135Copyright ? 2016, NTT Software Corporation.
☆https://github.com/mockito/mockito よりロゴを哈喘
mockの古廷
136Copyright ? 2016, NTT Software Corporation.
Hoge mockHoge = mock(Hoge.class);
Hoge hoge = new Hoge();
箭えば
で伏撹したmockHogeは
と`い
?メソッドのり、鯤打阿剖xしたり
?メソッドが柵ばれた並を瘁から_Jしたり
できる
spyの古廷
137Copyright ? 2016, NTT Software Corporation.
Hoge spyHoge = spy(new Hoge());
Hoge hoge = new Hoge();
箭えば
で伏撹したspyHogeは
と揖じg廾を隔ちつつ
?匯何のメソッドのり、鯤打阿剖xしたり
?メソッドが柵ばれた並を瘁から_Jしたり
できる
Mockitoの聞い圭
?児云
?モックの恬撹(mock)
?メソッドの尅る玲い筝(when, thenReturn, thenThrow)
?メソッドが柵び竃されたことを_J(verify)
?gオブジェクトの尅る玲い筝
?spyオブジェクト伏撹(spy)
?メソッドの尅る玲い筝(doReturn, doNothing, doThrow)
?巷塀ドキュメントのコ`ド箭歌孚
(1) Let's verify some behaviour!
(2) How about some stubbing?
(12) doReturn()|doThrow()| doAnswer()|doNothing()|
doCallRealMethod() family of methods
(13)Spying on real objects
138Copyright ? 2016, NTT Software Corporation.
Copyright ? 2016, NTT Software Corporation. 139
‐處3-1/ユニットテストh廠B
? 處n}
? ユニットテスト
? Robolectricのテストサンプル恬撹
? テストg佩
處n}
?參和恬Iを宥じて、テストh廠Bの圭隈を誼
してください。
?Android Studio貧でアプリを仟ラ撹する
?ビルドスクリプトを俐屎してRobolectric + Mockito
鬉砲垢
?Robolectricのテストサンプルを弖紗し、g佩してみる
Copyright ? 2016, NTT Software Corporation. 140
ユニットテスト(Gradle)
141
// (福待)
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// (福待)
testCompile 'junit:junit:4.12'
testCompile 'org.hamcrest:hamcrest-library:1.3'
testCompile 'org.robolectric:robolectric:3.0'
testCompile 'org.mockito:mockito-core:1.10.19'
// (福待)
} (携)駅勣なライブラリの傚冱
はe余戻幣
Copyright ? 2016, NTT Software Corporation.
Moduleのbuild.gradleファイル
Robolectricのテストサンプル恬撹(1/2)
?參和のクラスを恬撹
(テスト鵐ラス:EditActivity.javaのクラス兆の貧で
Alt+Enter★Create Test)
Copyright ? 2016, NTT Software Corporation. 142
@RunWith(RobolectricGradleTestRunner.class)
public class MyFirstRobolectricTest {
private EditActivity activity;
@Before
public void setup() {
activity = Robolectric.buildActivity(EditActivity.class).create().get();
}
@Test
public void testSomething() throws Exception {
assertTrue(activity != null);
}
}
Robolectricのテストサンプル恬撹(2/2)
? robolectric.propertiesファイル恬撹
Copyright ? 2016, NTT Software Corporation. 143
constants=[パッケ`ジ兆].BuildConfig
?コマンドラインからのg佩
?Instrumented Testをg佩する栽╋膨を俊Aした彜Bで
?Local Unit Test┰饂悗Robolectricをg佩する栽
?Android Studioからのg佩
?テストしたいメソッドやクラスをxkして嘔クリック★[Run]
(Ctrl+Shift+F10) ☆Preferences★keymap★Run context configuration
テストg佩
144
gradlew connectedAndroidTest
gradlew test
Copyright ? 2016, NTT Software Corporation.
テストコ`ドがvに
なっている
(歌深)MavenのプロキシO協
プロキシ塘和で旋喘する栽は參和のO協も駅勣
?參和のディレクトリにsettings.xmlを塘崔する
?Windows狼: c:?Users?ユ`ザ`兆?.m2?
?settings.xmlの坪否は參和の宥り
Copyright ? 2016, NTT Software Corporation. 145
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>‐プロキシのホスト兆/</host>
<port>‐プロキシのポ`ト桑催/</port>
</proxy>
</proxies>
</settings>
?AndroidのHTTP宥佚ライブラリOkHttpのサブコンポ`
ネントとして塘下
https://github.com/square/okhttp/tree/master/mockwebserver
?Apache License Version 2.0
?セットアップ圭隈
?build.gradleのdependenciesブロックに參和を峰
?サ`バの_兵圭隈
Copyright ? 2016, NTT Software Corporation. 146
testCompile 'com.squareup.okhttp:mockwebserver:2.7.5'
MockResponse response = ... (卦して圀しいレスポンスをMみ羨てる)
MockWebServer server = new MockWebServer();
server.enqueue(response);
server.start();
URL mockServerUrl = server.url("/test").url();
URLのprefix(販吭)を峺協
(歌深)MockWebServerについて(1/2)
(歌深)MockWebServerについて(2/2)
?MockResponse(卦して圀しいレスポンス)Mみ羨て圭隈
?MockWebServerK阻の圭隈(tearDown()で柵び竃す)
?プロキシO協のo浸(MockServer_兵念に柵び竃す)
h廠により音勣な栽もあり。h廠への卆贋を和げるためいておくのがベタ`。
Copyright ? 2016, NTT Software Corporation. 147
MockResponse response = new MockResponse()
// JSONのContent-Type峺協
.addHeader("Content-Type",
"application/json; charset=utf-8")
.setResponseCode(HTTPレスポンスコ`ド)
.setBody(HTTPレスポンスボディ);
server.shutdown();
System.clearProperty("proxyHost");
System.clearProperty("proxyPort");
Copyright ? 2016, NTT Software Corporation. 148
テスト鵐▲廛蠅僚瞠h
Copyright ? 2016, NTT Software Corporation. 149
‐處3-2,3/ビジネスロジックのテスト
Copyright ? 2016, NTT Software Corporation. 150
‐處3-4/イベントリスナのテスト
Copyright ? 2016, NTT Software Corporation. 151
‐處3-5/
HTTP宥佚を育うメソッドのテスト
Copyright ? 2016, NTT Software Corporation. 152
‐處3-6/
デ`タベ`スアクセスのテスト
4. CIのgF
? CIの古勣
? Android_kプロジェクトにm喘する
? (歌深)Instrumented Testもg佩する栽
Copyright ? 2016, NTT Software Corporation. 153
CIとは
?@A議インテグレ`ション(Continuous Integration)
?徭啜弔牧塹造g仏してくれる
?リポジトリから恷仟のソ`スコ`ド匯塀を函誼
?ビルドや徭咼謄好箸覆g佩し、そのY惚を宥岑
Copyright ? 2016, NTT Software Corporation. 154
宥械は喘の
サ`バで咾す
CIのメリット
?ビルド?テストに払,垢襯芥`ドがコミットされたとき
に、いち壼く返し、貨を嬉つことができる。
?Androidのように、ビルドや畠テストg佩にrgがかか
る栽でも、CIサ`バに畠てお販せすれば、伏b來鯢
につながる。
Copyright ? 2016, NTT Software Corporation. 155
Jenkins
?古勣
?レく聞われているCIサ`バ
https://jenkins.io/
?MIT License
?蒙
?インスト`ルがg
?コマンドライン1佩でOK (java -jar jenkins.war)
?yumやapt-getでインスト`ルすることも辛嬬
?O協がg
?畠てWeb鮫中からO協できる
Copyright ? 2016, NTT Software Corporation. 156
☆https://github.com/jenkinsci/jenkins よりロゴを哈喘
Android_kプロジェクトにm喘する
?念戻訳周
?Android StudioとGradleでプロジェクトがBされていること
?ソ`スコ`ドがSubversionやGitで砿尖されており、
CIサ`バからチェックアウトできること
?この冩俐でgFできる朕
?ビルドY惚
?Android LintY惚
?Local Unit TestY惚
?この冩俐では古勣のみ乾れる朕
?Instrumented TestY惚
(エミュレ`タの軟咾音芦協、g佩rgが掲械にLくなるなどの
}があるため、秘には佩e`が駅勣)
Copyright ? 2016, NTT Software Corporation. 157
Android_kプロジェクトにm喘する
?プラグインのインスト`ル
[Jenkinsの砿尖]★[プラグインの砿尖]
?(¥)Android Lint Plugin
?Gradle plugin
?Subversion plugin
(ソ`スコ`ドリポジトリがSubversionの栽)
?Git plugin
(ソ`スコ`ドリポジトリがGitの栽)
?JUnit plugin
Copyright ? 2016, NTT Software Corporation. 158
☆ Jenkins 2.0からは、セットアップrに仝Suggested Plugins々をxk
していれば、¥咫のプラグインのみインスト`ルすればOK
Android_kプロジェクトにm喘する
?[Jenkinsの砿尖]★[システムのO協]
?[Jenkinsの砿尖]★[Global Tool Configuration]
?圻tデフォルトO協のままでOK
?屡にインスト`ルされているJDKやgitなどを
旋喘したい栽はそのパスを峺協しても措い。
Copyright ? 2016, NTT Software Corporation. 159
Android_kプロジェクトにm喘する
?仟・献腑嶐撹
?仝フリ`スタイル?プロジェクトのビルド々をxk
?ソ`スコ`ド砿尖
?SubversionかGitをxkし、リポジトリのURLなどを秘薦
?ビルド?トリガ
?お挫みで。痴ったら仝SCMをポ`リング々で措い
?ビルド
?[ビルド返の弖紗]★[Invoke Gradle script]
?[Use Gradle Wrapper]をxk
?Tasksに[clean lint testDebugUnitTest]と秘薦
?ビルド瘁のI尖
?[ビルド瘁のI尖の弖紗]★[Publish Android Lint results]
([Lint files]は腎擇OK)
?[ビルド瘁のI尖の弖紗]★[JUnitテストY惚の鹿]
[テストY惚XML]に[app/build/test-results/debug/*.xml]と秘薦
Copyright ? 2016, NTT Software Corporation. 160
(歌深)Instrumented Testもg佩する栽
?[Jenkinsの砿尖]★[プラグインの砿尖]
?Android Emulator Pluginをインスト`ルする
?ジョブのO協
?[ビルドh廠]★[Run an Android emulator during build]にチェック
?軟咾靴燭ぅ┘潺絅讒`タの秤鵑鯣訌
?[Common emulator options]★[Show emulator window]はチェックし
ない
?[Invoke Gradle script]★[Tasks]
?[connectedAndroidTest]を弖紗
?[ビルド瘁のI尖]★[JUnitテストY惚の鹿]
?[テストY惚XML]を[app/build/**/TEST*.xml]に俐屎
Copyright ? 2016, NTT Software Corporation. 161
まとめ
Copyright ? 2016, NTT Software Corporation. 162
この冩俐でh苧したこと
?徭咼謄好箸砲弔い討凌爾┠
?Androidのテストツ`ル児A岑R
?Local Unit Test, Instrumented Test, ATSL, ...
?システムテスト徭啝ツ`ルの聞い圭
?Robotium, Espresso, UI Automator, Appium
?ユニットテスト徭啝ツ`ルの聞い圭
?光Nテストは參和のテクニックをl聞してgFする
?Android StudioのリファクタリングC嬬
?テスト喘のメソッド?コンストラクタの弖紗
?Mockitoのmock()とspy()
?MockWebServer
?CIのgF圭隈
Copyright ? 2016, NTT Software Corporation. 163
恷瘁に
?プロダクトコ`ドを徭啝したユニットテストで
カバ`することで、ソ`ス俐屎rの芦伉湖がゝ弔防呂ります。
?屡にレガシ`コ`ドがある栽は、畠何やろうとせず、
CIやユニットテストから富しずつ兵めて佩くと措いでしょう。
?テストが畠くoくても、CIだけ兵めてみる。
? Android Studioに卞佩するだけで兵められます。
?仟しくC嬬弖紗したところだけでもテストをいてみる。
?リリ`スを採業も佩うプロジェクトでは、
システムテスト徭啝にもチャレンジしてみてください。
Copyright ? 2016, NTT Software Corporation. 164
おわり
お藤れでした
https://www.ntts.co.jp/products/soft_dojyo/index.html

More Related Content

Androidテスティングg樹3 ユニットテスト?CI