SlideShare a Scribd company logo
1 of 102
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
ああ、素晴らしきTDD
~アプリとエンジニアの心に安寧を~
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
目次
● 自己紹介
● TDD
○ TDDとは
○ 実演
○ なぜTDD?
● Android TDD Q&A
● まとめ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
自己紹介
飯島彩輝
twitter:@saekisaekisaek
blog:エンジニアの便利手帳/3jigen.net
ヤフー株式会社
ヤフオク!Androidエンジニア
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
リーンソフトウェア開発
×
XP
(エクストリームプログラミング)
LEAN XP
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
質問
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
やりたい -> やろう
興味はある -> やりたい
やってる -> 復習
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
テスト駆動開発
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
ユニットテスト駆動開発
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
テスト駆動開発
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
fun getHello():String{
return "Hello"
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@Test
fun getHello_Helloを返す() {
val result = getHello()
assertEquals("Hello", result)
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
テスト=動作の保証
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
TDD
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
TDD
||
テストを先に書く
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
三つのルールを守って
三つのフェーズを繰り返す
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
三つのルールを守って
三つのフェーズを繰り返す
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
1 三つのフェーズ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
失敗するテストを書く
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
1 三つのフェーズ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
テストを通すコードを書く
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
1 三つのフェーズ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
リファクタリングする
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
1 三つのフェーズ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
1 三つのフェーズ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
三つのルールを守って
三つのフェーズを繰り返す
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
失敗したテストを通すためにしか
プロダクトコードを書いてはいけない。
1 三つのルール
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
一つ以上の失敗があるとき、
テストコードを書いてはいけない。
コンパイルエラーも失敗の一つである。
1 三つのルール
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
失敗するテストを通す以上の
プロダクトコードを書いてはいけない。
1 三つのルール
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
● 失敗したテストを通すためにしかコードを
書いてはいけない。
● 一つ以上の失敗があるとき、テストコード
を書いてはいけない。
● 失敗するテストを通す以上のコードを書いて
はいけない。
1 三つのルール
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
実演
じゃんけんを実装する
(Rock, paper, scissors)
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
1pと2pの”手”を渡すと
どちらが勝ったかを返すメソッド
start()を持つJankenクラス
1 実演
class Janken {
fun start(p1: String, p2: String): String {
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
三つのメリット
1 TDDとは
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
テストの漏れが発生しない
1 三つのメリット
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
良い設計になる
1 三つのメリット
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
常に綺麗なコードになる
1 三つのメリット
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
● 失敗したテストを通すためにしかコードを
書いてはいけない。
● 一つ以上の失敗があるとき、テストコード
を書いてはいけない。
● 失敗するテストを通す以上のコードを書いて
はいけない。
1 三つのルール
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
1 三つのフェーズ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
● テストの漏れが発生しない
● 良い設計になる
● 常に綺麗なコードになる
1 三つのメリット
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
水飲みます
テストとプロダクトを細かく行き来するので、
工数を見積もる場合も
「実装」としてひとまとめで考えるよ
<
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
GO FAST FOREVER
2 なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
GO FAST FOREVER
CLEAN CODE
2 なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
CLEAN CODE
REFACTOR
2 なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
if (isHoge() == false) {
} else {
val isFoo = result[0]["fuga"]
if (isFoo == false) {
} else {
var foo_name = getFooName(result[0]["foo_name"], 0, pos);
if (trim(foo_name) > 4) {
createBar(foo_name)
} else {
var fuga = ""
if (fuga != "") {
fuga += "fuga";
} else {
foo_name += "";
}
}
return foo_name
}
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
壊さずにできるか不安
2 なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
REFACTOR
CONFIDENCE
2 なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
CONFIDENCE
TEST !!
2 なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
GO FAST FOREVER
CLEAN CODE
REFACTOR
CONFIDENCE
TEST
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
GO FAST FOREVER
CLEAN CODE
REFACTOR
CONFIDENCE
TEST
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
GO FAST FOREVER
CLEAN CODE
REFACTOR
CONFIDENCE
TEST
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
GO FAST FOREVER
CLEAN CODE
REFACTOR
CONFIDENCE
TEST
TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
GO FAST FOREVER
CLEAN CODE
REFACTOR
CONFIDENCE
TEST
TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
TDD
||
良いアプリ
2 なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
TDD
||
安心感が特にすごい
2 なぜTDD?
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
水飲みます
逆にもうTDDじゃないと
不安でしょうがないよ
<
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Android TDD
Q&A
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Q.
androidTestとtestがあるけど
TDDではどっちをかくの?
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
A.
testの方
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
androidTest
||
インストルメントテスト
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
test
||
ローカルユニットテスト
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
TDDのredは
ローカルユニットテスト
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Q.
androidTestは使わない?
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
A.
使います
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
大事なところだけ
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
HappyPath
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
ユーザーにとって
最高の状態が
表示されているか
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
ユーザーにとって
最高の状態が
表示されているか
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
時間と安心のトレードオフ
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Q.
Unitテストの粒度って
どれくらい?
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
A.
public関数のふるまいごと
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@Test
fun start_グー対チョキなら1pが勝つ() {
// something
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@Test
fun start_グー対チョキかパー対グーなら1pが勝つ() {
// something
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@Test
fun start_グー対チョキなら1pが勝つ() {
// something
}
@Test
fun start_パー対グーなら1pが勝つ() {
// something
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Unit
||
public関数のふるまい
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
水飲みます
テストで使う、Mock・Spyなどはまとめてテ
ストダブルと呼ぶよ。テストダブルには
・Mock
・Spy
・Stub
・Fake
・Dummy
があるよ
<
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Q.
Unitテスト書くのが
すごく大変なんだけど?
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
A.
確かに
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
A.
作りを見直してみるといいかも
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
UIとロジックが分離しているか
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
viewModel.imageLiveData.observe(this, Observer<String> {
if (it.isEmpty()) {
// 空ならデフォルトのurlをセット
setImage(DEFAULT_IMAGE_URL)
} else {
setImage(it)
}
})
HogeFragment.kt
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
viewModel.imageLiveData.observe(this, Observer<String> {
if (it.isEmpty()) {
// 空ならデフォルトのurlをセット
setImage(DEFAULT_IMAGE_URL)
} else {
setImage(it)
}
})
HogeFragment.kt
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
viewModel.imageLiveData.observe(this, Observer<String> {
setImage(it)
})
HogeFragment.kt
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
val url = getUrlFromApi()
if (url.isEmpty()) {
// 空ならデフォルトのurlをセット
url = DEFAULT_IMAGE_URL
}
_imageLiveData.value = url
HogeViewModel.kt
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
依存を注入しているか
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
class HogeViewModel(
fooRepository: FooRepository,
baaService: BaaService
) : ViewModel() {
}
HogeViewModel.kt
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
val subject = HogeMenuViewModel(
fooRepositoryMock,
baaServiceMock)
HogeViewModelTest.kt
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
View以外が
Androidに依存しすぎてないか
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
1.ロジックとUIの分離
2.依存を注入する
3.Androidへの依存
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Q.
LiveDataが絡んできたら?
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@get:Rule
var taskExecutorRule = InstantTaskExecutorRule()
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@Mock
lateinit var helloObserverMock: Observer<String>
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@Test
fun getHello_helloを通知する() {
// arrange
subjectViewModel.hogeLiveData.observeForever(helloObservableMock)
// act
subjectViewModel.getHello()
// assert
verify(hogeObservableMock).onChanged("hello")
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Q.
RxJavaが絡んできたら?
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@Before
fun setUp() {
RxAndroidPlugins.setMainThreadSchedulerHandler { Schedulers.trampoline() }
RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
@After
fun tearDown() {
RxAndroidPlugins.reset()
RxJavaPlugins.reset()
}
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Q&A終わり
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
ググりながら
一緒に頑張りましょう!!
Android TDD
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
まとめ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
安心感と清潔さが魅力
まとめ
Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
終わり
< ありがとうございました!

More Related Content

What's hot

メトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーンメトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーンHiroyuki Ito
 
アジャイル品質パターンによる伝統的な品質保証(Quality Assurance)からアジャイル品質(Agile Quality)への変革
アジャイル品質パターンによる伝統的な品質保証(Quality Assurance)からアジャイル品質(Agile Quality)への変革アジャイル品質パターンによる伝統的な品質保証(Quality Assurance)からアジャイル品質(Agile Quality)への変革
アジャイル品質パターンによる伝統的な品質保証(Quality Assurance)からアジャイル品質(Agile Quality)への変革Hironori Washizaki
 
ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向Keizo Tatsumi
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話disc99_
 
ただしくHTTPSを設定しよう!
ただしくHTTPSを設定しよう!ただしくHTTPSを設定しよう!
ただしくHTTPSを設定しよう!IIJ
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
BDD Frameworkで回帰テストの自動実行を実現する方法
BDD Frameworkで回帰テストの自動実行を実現する方法BDD Frameworkで回帰テストの自動実行を実現する方法
BDD Frameworkで回帰テストの自動実行を実現する方法潤司 渡部
 
Kotlin/Native 「使ってみた」の一歩先へ
Kotlin/Native 「使ってみた」の一歩先へKotlin/Native 「使ってみた」の一歩先へ
Kotlin/Native 「使ってみた」の一歩先へTakaki Hoshikawa
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善Mizuho Wakai
 
アジャイル開発とメトリクス
アジャイル開発とメトリクスアジャイル開発とメトリクス
アジャイル開発とメトリクスRakuten Group, Inc.
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with KarateTakanori Suzuki
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with KarateTakanori Suzuki
 
アンチフラジャイルの世界
アンチフラジャイルの世界アンチフラジャイルの世界
アンチフラジャイルの世界Yoshitaka Kawashima
 
これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用Masaru Kurahayashi
 
Nginx Unitを試してみた話
Nginx Unitを試してみた話Nginx Unitを試してみた話
Nginx Unitを試してみた話Takehiro Torigaki
 

What's hot (20)

メトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーンメトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーン
 
アジャイル品質パターンによる伝統的な品質保証(Quality Assurance)からアジャイル品質(Agile Quality)への変革
アジャイル品質パターンによる伝統的な品質保証(Quality Assurance)からアジャイル品質(Agile Quality)への変革アジャイル品質パターンによる伝統的な品質保証(Quality Assurance)からアジャイル品質(Agile Quality)への変革
アジャイル品質パターンによる伝統的な品質保証(Quality Assurance)からアジャイル品質(Agile Quality)への変革
 
ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話
 
ただしくHTTPSを設定しよう!
ただしくHTTPSを設定しよう!ただしくHTTPSを設定しよう!
ただしくHTTPSを設定しよう!
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
はじめてのPRD
はじめてのPRDはじめてのPRD
はじめてのPRD
 
BDD Frameworkで回帰テストの自動実行を実現する方法
BDD Frameworkで回帰テストの自動実行を実現する方法BDD Frameworkで回帰テストの自動実行を実現する方法
BDD Frameworkで回帰テストの自動実行を実現する方法
 
Kotlin/Native 「使ってみた」の一歩先へ
Kotlin/Native 「使ってみた」の一歩先へKotlin/Native 「使ってみた」の一歩先へ
Kotlin/Native 「使ってみた」の一歩先へ
 
Keycloak入門
Keycloak入門Keycloak入門
Keycloak入門
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善
 
アジャイル開発とメトリクス
アジャイル開発とメトリクスアジャイル開発とメトリクス
アジャイル開発とメトリクス
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
アンチフラジャイルの世界
アンチフラジャイルの世界アンチフラジャイルの世界
アンチフラジャイルの世界
 
GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出
 
これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用これからのネイティブアプリにおけるOpenID Connectの活用
これからのネイティブアプリにおけるOpenID Connectの活用
 
Nginx Unitを試してみた話
Nginx Unitを試してみた話Nginx Unitを試してみた話
Nginx Unitを試してみた話
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 

Similar to ああ、素晴らしきTDD ~アプリとエンジニアの心に安寧を~

エクストリーム・プログラミング開発におけるUIテスト #yjbonfire
エクストリーム・プログラミング開発におけるUIテスト #yjbonfireエクストリーム・プログラミング開発におけるUIテスト #yjbonfire
エクストリーム・プログラミング開発におけるUIテスト #yjbonfireYahoo!デベロッパーネットワーク
 
Androidエンジニアになってからの1年間の感想と振り返り
Androidエンジニアになってからの1年間の感想と振り返りAndroidエンジニアになってからの1年間の感想と振り返り
Androidエンジニアになってからの1年間の感想と振り返りichirokato5
 
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMKoichi Sakata
 
誰でもできるGoogleアシスタント開発
誰でもできるGoogleアシスタント開発誰でもできるGoogleアシスタント開発
誰でもできるGoogleアシスタント開発Namito Satoyama
 
私たちがモブプロを始める前に知りたかったこと
私たちがモブプロを始める前に知りたかったこと私たちがモブプロを始める前に知りたかったこと
私たちがモブプロを始める前に知りたかったことhappy sato
 
How to create android's c to c EC APP !
How to create android's c to c EC APP !How to create android's c to c EC APP !
How to create android's c to c EC APP !Saiki Iijima
 
XP祭り2019 - 日立・ソフトウェア革新部会 ~会社を越境する社内コミュニティ~
XP祭り2019 - 日立・ソフトウェア革新部会 ~会社を越境する社内コミュニティ~XP祭り2019 - 日立・ソフトウェア革新部会 ~会社を越境する社内コミュニティ~
XP祭り2019 - 日立・ソフトウェア革新部会 ~会社を越境する社内コミュニティ~Masanori Kaneko
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsGo Sueyoshi (a.k.a sue445)
 
Google I/O 報告 (Google Assistant)
Google I/O 報告 (Google Assistant)Google I/O 報告 (Google Assistant)
Google I/O 報告 (Google Assistant)Masatoshi Itoh
 
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
私たち企業がアクセシビリティに取り組む理由(2018年) #accfesYahoo!デベロッパーネットワーク
 
Google apps scriptを使って業務改善
Google apps scriptを使って業務改善Google apps scriptを使って業務改善
Google apps scriptを使って業務改善dcubeio
 
Unification of the middle scale services by Nuxt.js
Unification of the middle scale services by Nuxt.jsUnification of the middle scale services by Nuxt.js
Unification of the middle scale services by Nuxt.jsHajimeSasanuma
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」虎の穴 開発室
 
QAエンジニアを通じて 弊社の開発環境がより良くなる日 〜 OpenSTF 編 〜
QAエンジニアを通じて弊社の開発環境がより良くなる日 〜 OpenSTF 編 〜QAエンジニアを通じて弊社の開発環境がより良くなる日 〜 OpenSTF 編 〜
QAエンジニアを通じて 弊社の開発環境がより良くなる日 〜 OpenSTF 編 〜gree_tech
 
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyoGitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyoYahoo!デベロッパーネットワーク
 

Similar to ああ、素晴らしきTDD ~アプリとエンジニアの心に安寧を~ (20)

エクストリーム・プログラミング開発におけるUIテスト #yjbonfire
エクストリーム・プログラミング開発におけるUIテスト #yjbonfireエクストリーム・プログラミング開発におけるUIテスト #yjbonfire
エクストリーム・プログラミング開発におけるUIテスト #yjbonfire
 
Androidエンジニアになってからの1年間の感想と振り返り
Androidエンジニアになってからの1年間の感想と振り返りAndroidエンジニアになってからの1年間の感想と振り返り
Androidエンジニアになってからの1年間の感想と振り返り
 
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVM
 
誰でもできるGoogleアシスタント開発
誰でもできるGoogleアシスタント開発誰でもできるGoogleアシスタント開発
誰でもできるGoogleアシスタント開発
 
私たちがモブプロを始める前に知りたかったこと
私たちがモブプロを始める前に知りたかったこと私たちがモブプロを始める前に知りたかったこと
私たちがモブプロを始める前に知りたかったこと
 
How to create android's c to c EC APP !
How to create android's c to c EC APP !How to create android's c to c EC APP !
How to create android's c to c EC APP !
 
Yahoo!ニュースにおける開発手法の取り組み
Yahoo!ニュースにおける開発手法の取り組みYahoo!ニュースにおける開発手法の取り組み
Yahoo!ニュースにおける開発手法の取り組み
 
XP祭り2019 - 日立・ソフトウェア革新部会 ~会社を越境する社内コミュニティ~
XP祭り2019 - 日立・ソフトウェア革新部会 ~会社を越境する社内コミュニティ~XP祭り2019 - 日立・ソフトウェア革新部会 ~会社を越境する社内コミュニティ~
XP祭り2019 - 日立・ソフトウェア革新部会 ~会社を越境する社内コミュニティ~
 
現場のインフラエンジニアから見たヤフー #ヤフー名古屋
現場のインフラエンジニアから見たヤフー #ヤフー名古屋現場のインフラエンジニアから見たヤフー #ヤフー名古屋
現場のインフラエンジニアから見たヤフー #ヤフー名古屋
 
全社デザインシステムとサービスの付き合い方
 全社デザインシステムとサービスの付き合い方 全社デザインシステムとサービスの付き合い方
全社デザインシステムとサービスの付き合い方
 
YJTC18 C-1 Kotlin導入の状況と展望
YJTC18 C-1 Kotlin導入の状況と展望YJTC18 C-1 Kotlin導入の状況と展望
YJTC18 C-1 Kotlin導入の状況と展望
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkins
 
Google I/O 報告 (Google Assistant)
Google I/O 報告 (Google Assistant)Google I/O 報告 (Google Assistant)
Google I/O 報告 (Google Assistant)
 
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
 
Google apps scriptを使って業務改善
Google apps scriptを使って業務改善Google apps scriptを使って業務改善
Google apps scriptを使って業務改善
 
Unification of the middle scale services by Nuxt.js
Unification of the middle scale services by Nuxt.jsUnification of the middle scale services by Nuxt.js
Unification of the middle scale services by Nuxt.js
 
通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」通販開発部の西田さん「通販開発マネジメントの5ルール」
通販開発部の西田さん「通販開発マネジメントの5ルール」
 
QAエンジニアを通じて 弊社の開発環境がより良くなる日 〜 OpenSTF 編 〜
QAエンジニアを通じて弊社の開発環境がより良くなる日 〜 OpenSTF 編 〜QAエンジニアを通じて弊社の開発環境がより良くなる日 〜 OpenSTF 編 〜
QAエンジニアを通じて 弊社の開発環境がより良くなる日 〜 OpenSTF 編 〜
 
未経験新卒入社でできること
未経験新卒入社でできること未経験新卒入社でできること
未経験新卒入社でできること
 
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyoGitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
 

More from Saiki Iijima

ViewModel テスト難しすぎ問題 by saiki iijima in Android Test Night #9
ViewModel テスト難しすぎ問題 by saiki iijima in Android Test Night #9ViewModel テスト難しすぎ問題 by saiki iijima in Android Test Night #9
ViewModel テスト難しすぎ問題 by saiki iijima in Android Test Night #9Saiki Iijima
 
Kotlin vs TypeScript
Kotlin vs TypeScriptKotlin vs TypeScript
Kotlin vs TypeScriptSaiki Iijima
 
Androidをやっただけで iOSアプリもできればいいのに 〜MOEという選択〜
Androidをやっただけで iOSアプリもできればいいのに 〜MOEという選択〜Androidをやっただけで iOSアプリもできればいいのに 〜MOEという選択〜
Androidをやっただけで iOSアプリもできればいいのに 〜MOEという選択〜Saiki Iijima
 
ソーシャルログイン5分クッキング
ソーシャルログイン5分クッキングソーシャルログイン5分クッキング
ソーシャルログイン5分クッキングSaiki Iijima
 

More from Saiki Iijima (6)

ViewModel テスト難しすぎ問題 by saiki iijima in Android Test Night #9
ViewModel テスト難しすぎ問題 by saiki iijima in Android Test Night #9ViewModel テスト難しすぎ問題 by saiki iijima in Android Test Night #9
ViewModel テスト難しすぎ問題 by saiki iijima in Android Test Night #9
 
Kotlin vs TypeScript
Kotlin vs TypeScriptKotlin vs TypeScript
Kotlin vs TypeScript
 
Androidをやっただけで iOSアプリもできればいいのに 〜MOEという選択〜
Androidをやっただけで iOSアプリもできればいいのに 〜MOEという選択〜Androidをやっただけで iOSアプリもできればいいのに 〜MOEという選択〜
Androidをやっただけで iOSアプリもできればいいのに 〜MOEという選択〜
 
Aruaru short-cut
Aruaru short-cutAruaru short-cut
Aruaru short-cut
 
In-app messaging
In-app messagingIn-app messaging
In-app messaging
 
ソーシャルログイン5分クッキング
ソーシャルログイン5分クッキングソーシャルログイン5分クッキング
ソーシャルログイン5分クッキング
 

ああ、素晴らしきTDD ~アプリとエンジニアの心に安寧を~

  • 1. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. ああ、素晴らしきTDD ~アプリとエンジニアの心に安寧を~
  • 2. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 目次 ● 自己紹介 ● TDD ○ TDDとは ○ 実演 ○ なぜTDD? ● Android TDD Q&A ● まとめ
  • 3. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 自己紹介 飯島彩輝 twitter:@saekisaekisaek blog:エンジニアの便利手帳/3jigen.net ヤフー株式会社 ヤフオク!Androidエンジニア
  • 4. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
  • 5. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. リーンソフトウェア開発 × XP (エクストリームプログラミング) LEAN XP
  • 6. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 質問
  • 7. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. やりたい -> やろう 興味はある -> やりたい やってる -> 復習
  • 8. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. TDDとは
  • 9. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. テスト駆動開発 1 TDDとは
  • 10. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. ユニットテスト駆動開発 1 TDDとは
  • 11. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. テスト駆動開発 1 TDDとは
  • 12. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. fun getHello():String{ return "Hello" }
  • 13. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @Test fun getHello_Helloを返す() { val result = getHello() assertEquals("Hello", result) }
  • 14. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
  • 15. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
  • 16. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
  • 17. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. テスト=動作の保証 1 TDDとは
  • 18. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. TDD 1 TDDとは
  • 19. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. TDD || テストを先に書く 1 TDDとは
  • 20. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 三つのルールを守って 三つのフェーズを繰り返す 1 TDDとは
  • 21. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 三つのルールを守って 三つのフェーズを繰り返す 1 TDDとは
  • 22. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 1 三つのフェーズ
  • 23. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 失敗するテストを書く Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 1 三つのフェーズ
  • 24. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. テストを通すコードを書く Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 1 三つのフェーズ
  • 25. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. リファクタリングする Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 1 三つのフェーズ
  • 26. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 1 三つのフェーズ
  • 27. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 三つのルールを守って 三つのフェーズを繰り返す 1 TDDとは
  • 28. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 失敗したテストを通すためにしか プロダクトコードを書いてはいけない。 1 三つのルール
  • 29. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 一つ以上の失敗があるとき、 テストコードを書いてはいけない。 コンパイルエラーも失敗の一つである。 1 三つのルール
  • 30. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 失敗するテストを通す以上の プロダクトコードを書いてはいけない。 1 三つのルール
  • 31. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. ● 失敗したテストを通すためにしかコードを 書いてはいけない。 ● 一つ以上の失敗があるとき、テストコード を書いてはいけない。 ● 失敗するテストを通す以上のコードを書いて はいけない。 1 三つのルール
  • 32. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 実演 じゃんけんを実装する (Rock, paper, scissors) 1 TDDとは
  • 33. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 1pと2pの”手”を渡すと どちらが勝ったかを返すメソッド start()を持つJankenクラス 1 実演 class Janken { fun start(p1: String, p2: String): String {
  • 34. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 三つのメリット 1 TDDとは
  • 35. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. テストの漏れが発生しない 1 三つのメリット
  • 36. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 良い設計になる 1 三つのメリット
  • 37. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 常に綺麗なコードになる 1 三つのメリット
  • 38. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. ● 失敗したテストを通すためにしかコードを 書いてはいけない。 ● 一つ以上の失敗があるとき、テストコード を書いてはいけない。 ● 失敗するテストを通す以上のコードを書いて はいけない。 1 三つのルール
  • 39. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 1 三つのフェーズ
  • 40. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. ● テストの漏れが発生しない ● 良い設計になる ● 常に綺麗なコードになる 1 三つのメリット
  • 41. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 水飲みます テストとプロダクトを細かく行き来するので、 工数を見積もる場合も 「実装」としてひとまとめで考えるよ <
  • 42. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. なぜTDD?
  • 43. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. GO FAST FOREVER 2 なぜTDD?
  • 44. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. GO FAST FOREVER CLEAN CODE 2 なぜTDD?
  • 45. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. CLEAN CODE REFACTOR 2 なぜTDD?
  • 46. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. if (isHoge() == false) { } else { val isFoo = result[0]["fuga"] if (isFoo == false) { } else { var foo_name = getFooName(result[0]["foo_name"], 0, pos); if (trim(foo_name) > 4) { createBar(foo_name) } else { var fuga = "" if (fuga != "") { fuga += "fuga"; } else { foo_name += ""; } } return foo_name } }
  • 47. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 壊さずにできるか不安 2 なぜTDD?
  • 48. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. REFACTOR CONFIDENCE 2 なぜTDD?
  • 49. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. CONFIDENCE TEST !! 2 なぜTDD?
  • 50. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. GO FAST FOREVER CLEAN CODE REFACTOR CONFIDENCE TEST
  • 51. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. GO FAST FOREVER CLEAN CODE REFACTOR CONFIDENCE TEST
  • 52. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. GO FAST FOREVER CLEAN CODE REFACTOR CONFIDENCE TEST
  • 53. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. GO FAST FOREVER CLEAN CODE REFACTOR CONFIDENCE TEST TDD
  • 54. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. GO FAST FOREVER CLEAN CODE REFACTOR CONFIDENCE TEST TDD
  • 55. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. TDD || 良いアプリ 2 なぜTDD?
  • 56. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. TDD || 安心感が特にすごい 2 なぜTDD?
  • 57. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 水飲みます 逆にもうTDDじゃないと 不安でしょうがないよ <
  • 58. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Android TDD Q&A Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
  • 59. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Q. androidTestとtestがあるけど TDDではどっちをかくの? Android TDD
  • 60. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. A. testの方 Android TDD
  • 61. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. androidTest || インストルメントテスト Android TDD
  • 62. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. test || ローカルユニットテスト Android TDD
  • 63. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. TDDのredは ローカルユニットテスト Android TDD
  • 64. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Q. androidTestは使わない? Android TDD
  • 65. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. A. 使います Android TDD
  • 66. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 大事なところだけ Android TDD
  • 67. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. HappyPath Android TDD
  • 68. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. ユーザーにとって 最高の状態が 表示されているか
  • 69. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. ユーザーにとって 最高の状態が 表示されているか
  • 70. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 時間と安心のトレードオフ Android TDD
  • 71. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Q. Unitテストの粒度って どれくらい? Android TDD
  • 72. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. A. public関数のふるまいごと Android TDD
  • 73. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @Test fun start_グー対チョキなら1pが勝つ() { // something }
  • 74. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @Test fun start_グー対チョキかパー対グーなら1pが勝つ() { // something }
  • 75. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @Test fun start_グー対チョキなら1pが勝つ() { // something } @Test fun start_パー対グーなら1pが勝つ() { // something }
  • 76. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Unit || public関数のふるまい Android TDD
  • 77. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 水飲みます テストで使う、Mock・Spyなどはまとめてテ ストダブルと呼ぶよ。テストダブルには ・Mock ・Spy ・Stub ・Fake ・Dummy があるよ <
  • 78. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Q. Unitテスト書くのが すごく大変なんだけど? Android TDD
  • 79. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. A. 確かに Android TDD
  • 80. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. A. 作りを見直してみるといいかも Android TDD
  • 81. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. UIとロジックが分離しているか Android TDD
  • 82. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. viewModel.imageLiveData.observe(this, Observer<String> { if (it.isEmpty()) { // 空ならデフォルトのurlをセット setImage(DEFAULT_IMAGE_URL) } else { setImage(it) } }) HogeFragment.kt
  • 83. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. viewModel.imageLiveData.observe(this, Observer<String> { if (it.isEmpty()) { // 空ならデフォルトのurlをセット setImage(DEFAULT_IMAGE_URL) } else { setImage(it) } }) HogeFragment.kt
  • 84. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. viewModel.imageLiveData.observe(this, Observer<String> { setImage(it) }) HogeFragment.kt
  • 85. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. val url = getUrlFromApi() if (url.isEmpty()) { // 空ならデフォルトのurlをセット url = DEFAULT_IMAGE_URL } _imageLiveData.value = url HogeViewModel.kt
  • 86. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 依存を注入しているか Android TDD
  • 87. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. class HogeViewModel( fooRepository: FooRepository, baaService: BaaService ) : ViewModel() { } HogeViewModel.kt
  • 88. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. val subject = HogeMenuViewModel( fooRepositoryMock, baaServiceMock) HogeViewModelTest.kt
  • 89. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. View以外が Androidに依存しすぎてないか Android TDD
  • 90. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 1.ロジックとUIの分離 2.依存を注入する 3.Androidへの依存 Android TDD
  • 91. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Q. LiveDataが絡んできたら? Android TDD
  • 92. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @get:Rule var taskExecutorRule = InstantTaskExecutorRule()
  • 93. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @Mock lateinit var helloObserverMock: Observer<String>
  • 94. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @Test fun getHello_helloを通知する() { // arrange subjectViewModel.hogeLiveData.observeForever(helloObservableMock) // act subjectViewModel.getHello() // assert verify(hogeObservableMock).onChanged("hello") }
  • 95. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Q. RxJavaが絡んできたら? Android TDD
  • 96. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @Before fun setUp() { RxAndroidPlugins.setMainThreadSchedulerHandler { Schedulers.trampoline() } RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() } }
  • 97. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. @After fun tearDown() { RxAndroidPlugins.reset() RxJavaPlugins.reset() }
  • 98. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. Q&A終わり Android TDD
  • 99. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. ググりながら 一緒に頑張りましょう!! Android TDD
  • 100. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. まとめ Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved.
  • 101. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 安心感と清潔さが魅力 まとめ
  • 102. Copyright(C) 2019 Yahoo Japan Corporation.All Rights Reserved. 終わり < ありがとうございました!

Editor's Notes

  1. まず本日のお品書きです 自己紹介をして TDDの話をして AndroidのTDDの話をして まとめて終わりたいともいます。
  2. 自己紹介です。 あたらめまして、飯島彩輝と申します。 ヤフー株式会社でヤフオク!というオークションアプリのAndroidアプリ開発をしています。 デジタルではこのご飯のアイコンで生きてますのでよろしくお願いします。
  3. これがヤフオクです、オークションで売ったり買ったりできます。よかったら使ってみてください。
  4. このヤフオク!のアプリを開発している部署では、リーンソフトウェア開発と、エクトリームプログラミングというものを合わせたリーンXPという開発手法で日々開発していまして、ペアプロとTDDが特徴的です。 今日は、その経験から、AndroidでTDDするための基本的な知識をお伝えしたいと思います。
  5. ちなみに今、仕事や趣味でTDDやっているよってかた手を挙げていただいてもよろしいでしょうか? ちょいちょいいますね、ありがとうございます。 TDDこれからやりたいと思ってる方〜 わりといますね。 ということは、残りは興味はあるっていう方々ですかね。いいですね。
  6. 今日の発表ではやりたいと思っている方はやろうと思える、興味のある方はやりたいと思えることがゴールです。 もうすでにやっている方はおさらいだと思ってきいていただければと思います
  7. それでは早速TDDとは一体何かということと、実際にどうやるのかを説明していきます。
  8. TDDとはTestドリブンデベロップメントの略で、日本語でいうとテスト駆動開発、開発手法の一種です。 このテストっていうのは
  9. UnitTestを表しているので、これから単純にテストといったらユニットテストのことをいっているとおもってください。
  10. では、前提知識としてテストとはどういうものか確認しておきます。
  11. 例えばこのようなHelloという文字列を返すgetHello functionがあった時に、実際に”Hello”が間違いなく返ってきているかを検証するために書くコードが、テストコードです。
  12. 実際に書くとこんな感じです。 getHelloを叩いて返ってきた結果resultが”Hello”文字列と一致しているかをassertEqualsというテスト専用の関数でチェックします。 あ、ちなみにこの発表ではテストは全てJUnitを使って書いていますのでよろしくお願いします。 これを実行して
  13. このように表示されればHelloファンクションが正しく動いていることが保証されることになります。
  14. 失敗しているとこのような表示がされ
  15. どう違っているのかが出力されます。 この場合Helloが返ってきてほしいのにWorldが返ってきているので怒られています。
  16. このように対象の機能が正しく動作していることを保証するのがテストコードの役割です。
  17. では本題のTDDについてです。
  18. TDDという開発手法は、簡単にいってしまうとテストコードをプロダクトコードよりも先に書く開発のことです。 これだけでも間違いとは言えないんですが、 実際は、もう少し決まりがあってですね、TDDをするならば、
  19. 三つのルールを守ってと三つのフェーズを繰り返す必要があります。
  20. まず、わかりやすい方の三つのフェーズから先に説明します、
  21. TDDは常にレッドーグリーンーリファクタの三つのフェーズの繰り返しで進んでいきます。
  22. 開始はレッドで、失敗するテストを書くフェーズです。 プロダクトコードにまだ実装がない状態で、失敗するテストを一つかきます。
  23. レッドの次はグリーンです。グリーンはテストを通すコードを書くフェーズです。 redで失敗させたテストをグリーンの段階で通るようにプロダクトコードを修正します。
  24. 三つ目がリファクタのフェーズ。その名の通り、コードを綺麗にリファクタリングします。 このリファクタはプロダクトコードはもちろんですが、テストコードに関しても行います。 この段階で、動作を保証するテストと、実際に動作しているプロダクトコードが存在していることになりますので、リファクタしたことで動作が壊れてしまっていないかを、テストをこまめに回し、確かめながら進めていくことができます。
  25. この三つを一つのユニットテストごとに繰り返します。
  26. 次に三つのルールについて説明します。この三つのルールはコードを書く手順についてのルールになります。
  27. まず一つ目、失敗したテストを通すためにしかプロダクトコードを書いてはいけない。というルールです
  28. 二つ目が、一つ以上の失敗があるとき、テストコードを書いてはいけない。そして、コンパイルエラーも失敗の一つである。というルールです。
  29. 三つ目が失敗するテストを通す以上のプロダクトコードを書いてはいけない。というルールです。
  30. この三つを守りながら先ほどの三つのフェーズを進めていくのですが
  31. 口で説明するよりも実際に見た方がイメージが湧きナスいので 今から、実際にTDDを実演しながら説明させていただきます。 今回はみんな大好きじゃんけんを実装してみます。 具体的には
  32. 1pと2pの手、グーチョキパーのどれかですね、その二つの引数を渡したら、どっちが勝ちかを返すstartメソッドを持つクラスを作ってみます。 string二つを渡してstringを返します。 じゃんけんのルールせつめいは時間の関係で割愛させていただきますから、ご存じない方は今のうちにググってもらえればと思います。 (やる) 一つのテストの中で三つの役割のコードを書きます。 ということで実際にTDDをやってみました。テストとプロダクトの行き来が思ったより激しかったのではないかなと思います。
  33. 今のようにTDDのルール通りに実装していくのは少し窮屈に感じるかもしれませんが少なくとも三つのメリットがあります
  34. まず、テストの漏れが発生しなくなります。ルール通りに進めれば基本的にテストがないプロダクトコードは生まれません。 必然的に全てのロジックにテストが存在している状態になるはずです。
  35. 自然と良い設計になります。 テストを通すための最低限のコードを書くというルールですから、自然と一番シンプルでテストが書きやすい実装になっていくはずです。 テストを書きやすい設計というのは、依存が少ないとか、副作用が少ないとか、そのままプロダクトとしても良い設計と言えますから。 テストを先に書くと自然と良い設計になると言えます。
  36. 常に綺麗なコードになります。 リファクタのフェーズでコードの改善を細かく繰り返しますから、コードは基本的に綺麗な状態で保たれるというわけです。
  37. ということで、第1章のまとめです。 TDDとはこの三つのルールを守りながら、
  38. この三つのフェーズ、レッド・グリーン・リファクタを繰り返す開発で、
  39. これら三つのメリットがあります。
  40. 水飲みます
  41. TDDのやり方がわかったところで、なぜTDDをやっていくべきなのか?について話します。なんのためにやっているのかわからないと、ただ面倒なだけに感じてしまい、長続きしにくいので始める前にチームでしっかりと理解しておきましょう。 当然、最終的により良いアプリをユーザーに届けられるようにTDDしているわけなのですが、良いアプリを作るためにTDDをするべきだという答えをリーンXPではどのような考えから導き出しているのかを順に説明していきます。
  42. まず、一番の大元に、Go Fast Forever という考え方があります 良いアプリを作るためには、細かくユーザーからフィードバックをもらい、細かく改善を繰り返していく必要があります。 それを実現するためには品質を保ちながらも効率よく、素早く開発する必要があるという考え方です。 Foreverですから、最初だけではなく、アプリが大きくなったとしても高い品質で高速に開発できるべきです。 ではそのために何が必要かというと
  43. CLEANCODE 綺麗なコードです コードは書いているうちに日に日に汚れていき、汚れれば汚れるほど読んだり触ったりしたくない気持ちが強くなりますよね。 精神的な話だけではなくて、可読性、メンテナンス性の低いコードは開発の大きな妨げになりますから、コードは常に綺麗に保っておく必要があります。 では、どうすれば綺麗に保てるのか?
  44. リファクタです。 綺麗なまま保ちたいのであれば、掃除をしなければいけません。 また、どんどん汚くなるのであれば、負けじとリファクタも繰り返し継続的に行う必要があります。 ではどうすれば、継続的にリファクタリングができるのでしょうか? 逆に、リファクタできないのはなぜでしょうか? 例えばこういうコード
  45. こういうコードを見たとき、絶対リファクタできそうですけど、正直触りたくないですよね。 こういうコードをなぜ触りたくないのかというと、おそらく
  46. 壊さずにできるかが不安だからではないでしょうか。 そもそも何が正しいのか答えがわからないので、壊さずにリファクタできるか、できたかどうかかさえもわかりませんし、 折角リファクタしてもバグを出してしまったら悲しい気持ちになりますから、二の足を踏んでしまうわけです。 つまりリファクタの妨げになるのは不安な気持ちで、 それをなくす為に必要なのは
  47. カンフィデンス 自信、安心です。 リファクタをしても壊れない、もしくは壊れていないかどうかがすぐに確認できて、壊れていたら直せるような状態であれば安心してリファクタすることができます。 それはどういう状態かというと
  48. テストがある状態なわけです。 テストを書くことで、機能が正しく動作していることが保証されますし、万が一機能が壊れてしまったとしても、すぐに気づいてなおすことができます。
  49. つまりテストをしっかり書くことで安心でき、リファクタができ、綺麗なコードを保て、効率的な開発に繋がり、最終的に良いアプリを作ることができるわけです。
  50. 逆にテストを書かなければ
  51. この全てが成り立たないわけです テストが起点になっていて、一番大事というわけですから当然、その大事なものをより早くしっかり書きたい、ということで
  52. TDDにつながります。 テストが大事だからテストを先に書くべきだ、だからTDDをするべきというわけです。
  53. 特に、経験上、実感があるのはここの安心感ですね。わたし自身TDDで開発するようになってから、リファクタへの精神的つらみみたいな物がすごく軽減されました。
  54. まとめるとTDDをすることで良いアプリがより早く作れ、
  55. 安心感が特にすごいのでTDDをやりましょうという話でしたた。
  56. 水飲みます
  57. さて、ここまでくればもうあとはやるだけなのですが、 実際にAndroidでTDDをやりたいとなった時に、やはり、わからないことっていうのがいくつか出てきがちです。 なのでAndroidTDD初心者がきっと疑問に思うであろうことをQ&A方式でみていきたいと思います。
  58. AndroidのテストフォルダにはandroidTestと普通のtestががありますがTDDのテスト、つまりレッドのフェーズではどちらを書くのでしょうか?
  59. 基本的にはtestフォルダの方のテストを書きます。 なぜかというと
  60. まずandroidTestフォルダ、ここはインストルメントテストを置くところです。 インストルメントテストとは実際の端末、もしくはエミュレータ上で動かすEspressoを使ったUIテストなどですね。 性質上実行が遅いです。
  61. testフォルダに置くテスト、これは、ローカルユニットテストです。 その名の通りユニットテストを置きます。ここに置いたテストはJVM上で実行されます。 エミュレータなどを必要としないので実行が早いです
  62. 一番初めに説明したようにTDDのテストは基本的にはユニットテストのことを指しますので、redフェーズで書くのはtestフォルダにあるローカルユニットテストになります。
  63. ただ、じゃあAndroidTestは書かないのかというと
  64. そういうわけではなくて、三つのフェーズとは別軸で書きます。
  65. androidTestは実行に時間がかかりますから、UnitTestのようにくまなく書いていると、全て実行するのに莫大な時間がかかってしまい現実的ではありません。 なので、たくさんある動作の中で大事なところだけを書いていきます。 具体的に大事なところとはどこか決める時は、
  66. ハッピーパスというものを考えるとよいです。 ハッピーパスというのは、その名の通りユーザーが一番ハッピーになる経路のことを指します。
  67. たとえばログイン済みのユーザーが、商品を購入する画面の場合であれば、
  68. ログイン済みの時に各要素が表示されていて、購入ボタンをタップして正しい画面に遷移するのがハッピーパスになります。 基本的にUIテストはこのハッピーパスだけにとどめて、それ以外は書かないことが多いです。 なぜそれでいいかというと、基本的にロジックは全てviewより下の層に書かれていて、その動作はUnitTestで保証されているはずだからです。 もちろん、ハッピーパス以外で重要だと判断される経路があれば、かけば良いですが、
  69. 、それによって得られる安心感と、テストを書くことや実行にかかる時間とのトレードオフを常に意識してバランスを取っていく必要があります。
  70. Unitテストと言いますが、Unitっていうのはどういう単位のことをいうのでしょうか?  Unitっていうのはもともと、順番を変えて実行しても問題なく動く単位のことですので、少なくとも順番に関係なく正しく動作するテストである必要があります。 その上で具体的にどの程度にするかというと、もちろん場合やプロジェクトによるとは思うのですが、基本的には
  71. public関数のふるまいごと、公開されている関数の一つのふるまいに対して、一つのテストにするのが無難です。
  72. さっきちょっと書きましたが、グー対チョキだった時に1pが勝つっていうのは一つの振る舞いなので、一つのテストになります。
  73. こんな風にグー対チョキかパー対グーなら1pが勝つみたいなテストは、1pが勝つという結果は同じですが、グー対チョキとパー対グー、二つの振る舞いをテストしてますから
  74. このように二つに分けるべきです。 じゃあprivateの関数はテストしなくていいのか?と思うかもしれないんですが、privateの関数に関しては、それ用のテストを書かないだけでテストはされることになるので大丈夫です。 というのも、privateの関数っていうのは辿っていけばpublicの関数から呼ばれているはずですから、publicの全ての振る舞いがテストされていれば、その振る舞いのどこかでprivateの関数も正しく動いていることが保証されるはずだからです。
  75. ということで一つのUnitTestはpublic関数の一つの振る舞いを表すのが無難です。
  76. 水飲みます
  77. Unitテストを書いていると、やけに大変で、プロダクトコードよりテストコード書くほうが全然難しいんじゃんって思うことがあるかもしれません。で、これはもう
  78. 確かに っていう感じですね。実際テストを上手く書くのって結構難しいです。ただ、あまりにも書きにくい時はもしかしたら
  79. プロダクトコードの作りを見直してみるといいかもしれません。 折角なのでAndroid初心者の頃の自分に教えたい三つの観点を持ってきました。
  80. まず一つ目 UIに関する処理がView、ActivityやFragmentに書いてあって、ロジックがとそれ以外に書かれているか確認してみましょう 何も考えずに書いていると、気がついたらFragmentがいっぱいロジック持ってるみたいなことが起がちです、 MVPならPresenter以下にMVVMならViewModel以下にロジックを持たせるように意識しましょう。 例えば、MVVMで
  81. このようにFragmentがViewModelのliveDataをobserveして、流れてきたURLをimageViewにセットするような処理があったとします。 からならデフォルトをセットして、そうでなければ流れてきたurlをセットします。 これでも正しく動くんですが、
  82. ここの、もし空ならデフォルトのUrlをセットするという処理、これすごく単純ですが、ロジックですよね。 これをテストしようとすると、FragmentっていうのはAndroidの持ち物ですから、Roborectlicを使う必要が出てきたりします。 Roborectlicを使うとシンプルなUnitTestよりも実行に時間がかかるのであまりうれしくありませんし、ない方がシンプルです。 とにかくこの一行のロジックのテストのために少し余計なことを考える必要が出てきてしまいます。
  83. そういったことが起きないように、Fragmentでは流れてきたデータをセットするだけにして
  84. 空かどうかのチェックはこんな風にViewmodelに書いてやれば、ViewModelのテストとしてモックしたサービスからの返り値をnullにするだけで高速にテストがかけますのですごく簡単です。 次が
  85. 二つ目が依存は注入しているか。 これはもはやテスト書くとなるとせざるを得ないですね。 DIと聞くとDaggar2とかkoinとかが浮かぶかもしれませんが、別に単純なコンストラクタDIでも問題ありません。
  86. こんな感じで、サービスやら、リポジトリやらをコンストラクタから渡せるようにしておいてやればテストに関しては大丈夫です。 ライブラリを使ったら使ったでより今風で良いかもしれません。
  87. テスしたい時にはもきートなどのモックライブラリを使うか自力で作ってやったMockを渡してやれば良いです。 これは余談ですが、今から始めるならmockKを使うのがおすすめです。
  88. 最後がView以外がAndroidに依存しすぎていないか UnitTestはJVM場で動くのでAndroidの持ち物は基本的に動かすことができません。 TextUtilsとか、contextとかですね。 どんなに依存していてもRoborectlicなどを使えばどうにかなるのですが、なくせるなら無くした方が楽です。
  89. ということでなんかテスト描きにくいなという場合はこの三点を意識してみると良いかもしれません。 次のQです
  90. 最近だとテストにLiveDataが絡んで来ることって多いですよね、 LiveDataに正しく値が渡されているかを検証したい場合は
  91. InstantTaskExecuttorRuleをRuleとして宣言してやって
  92. Observerをモックで作ってやって
  93. あとはobserveForeverでオブザーブしてOnChangedが正しい引数で呼ばれているかチェックしてやると良いです。 引数がprimitive型やdataclassではない場合はargumentcaptureを使う必要があります。
  94. API呼び出しにRetroFitとRxJavaの組み合わせを使ってたりすると、テストにRxJavaが絡んでくることってよくありますよね、そのAPIを叩いて帰ってきた値に対して処理をするようなテストを何も考えずにやろうとすると値が帰って来る前にテストが終わってしまいます。 そういった場合はスケジューラを渡せるように作っておいてテストの時にテスト用のものを渡すか
  95. @Beforeでこんな感じでトランポリンをセットしてやると 非同期を意識せずにテストできます。 複雑なテストをしたい場合は TestScheduler TestSubscriber などを使うことになります。
  96. この方法の場合はteardownでリセットするのを忘れずに。
  97. Q&Aは以上です。他にもテスト書いていると困ること結構あるんですが、あとはもう
  98. ぐぐりながら一緒に頑張っていきましょう。
  99. ということで、今日はTDDを始めるにあたって必要な基礎知識と、それをAndroid開発で実践するためのTipsを紹介させていただきました。 TDDをやることで得られるメリットは色々とありますが、特に、
  100. しっかりくまなくテストをかくことによる安心感と、常にリファクタをすることで保てるコードの清潔さはテストを書く工数を補ってあまりあるメリットとしてすぐに感じられると思います。 常に不安と戦っていたり、リファクタしたくてウズウズしている方はぜひ、今日をきっかけに初めてみていただければと思います。本当にオススメです。
  101. では、以上で終了とさせていただきます。 お時間いただき、本当にありがとうございました。
  102. 例えばViewModelの中でこのようにTextUtilsを使っているとします。 TextUtilsはAndroidパッケージ内にあるのでこのはif分はJunitのテストだと常にfalseになります。 Roborectricを使うなどすればテストできないことはないのですが、最初からないほうがテストはよりシンプルにかけます。
  103. テストを書く分工数がかかってしまい、効率が悪いんじゃないか? 一度は思ったことがあるのではないかと思います。 ただですね、答えとしては
  104. テストを書く分の 工数はかかるが全体で見れば 効率は上がる
  105. 先ほどのGetHelloの例でいうと 上がプロダクトコード、下がテストコードで最終的には両方が存在することになるのですが、 かかれる順番が
  106. まず下のテストを描いてから
  107. 上のGetHelloを書くという流れになります。 これがTDDの一番の基本であり、原則です。 もちろんもう少し細かいルールがありますので図で見てみます
  108. ではさらに具体的に、
  109. そう、汚いコードですね。 イラストはトイレなんですけど、コードもトイレも同じで、使っているうちに日に日に汚れていき、汚れれば汚れるほど近づいたり触ったりしたくない気持ちが強くなります。
  110. リファクタです。 綺麗なまま保ちたいのであれば、掃除をしなければいけません。
  111. 逆にローカルUnitテストは、チェックする範囲が狭い分、実行にかかる時間が短いですから
  112. かけるところは出来るだけ書くのが良いです。 TDDでのRedフェーズで書くテストが基本的にこのTestフォルダにあるローカルUnitTestになりますので、TDDをしていると必然的にほぼ全てのロジックを網羅することになります。 ただやはり実際のプロダクトとなると、色々な兼ね合いでテストを書きづらかったりかけない所っていうのは出てきてしまう場合があるので書けるところという書き方にしました。
  113. AndroidにはandroidTestとtestがありますが、
  114. TDDのredフェーズで書くのはtestフォルダの方のテストで
  115. AndroidTestの場合、かかる時間は長いですから
  116. 量はなるべく少なく、それでいて、大事なところだけはしっかりとかくのが良いです。 UnitTestのように振る舞い全てを網羅しようとすると、実行に何時間もかかるようになってしまいますし、そもそも書くのも難しいです。
  117. 具体的に大事なところとはどこか決める時は、
  118. トレードオフ
  119. トレードオフ
  120. トレードオフ
  121. トレードオフ
  122. トレードオフ
  123. まずはテストの種類についてです。
  124. ユーザーに使われるのに近い状態でテストが動きますので信頼性が高いです。 ただその代わり実行にはある程度の時間がかかります。
  125. エミュレータを使わないので早いしシンプルです。 単体の機能の検証は行えますが、実際にユーザーの目に触れる部分のテストではないので、その点でインストルメントテストと比較すると信頼性が低いと言えます。 テスト対象にAndroidライブラリへの依存があったりする場合はRoborectricなど、それ用のライブラリをを使う必要があります。
  126. TDD中は基本的にこの三つのルールを守らなければいけません。