狠狠撸

狠狠撸Share a Scribd company logo
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 (20)

フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
?
ドメイン駆动设计に15年取り组んでわかったこと
ドメイン駆动设计に15年取り组んでわかったことドメイン駆动设计に15年取り组んでわかったこと
ドメイン駆动设计に15年取り组んでわかったこと
増田 亨
?
こわくない Git
こわくない Gitこわくない Git
こわくない Git
Kota Saito
?
人生か?ときめくAPIテスト自動化 with Karate
人生か?ときめくAPIテスト自動化 with Karate人生か?ときめくAPIテスト自動化 with Karate
人生か?ときめくAPIテスト自動化 with Karate
Takanori Suzuki
?
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
?
组织にテストを书く文化を根付かせる戦略と戦术
组织にテストを书く文化を根付かせる戦略と戦术组织にテストを书く文化を根付かせる戦略と戦术
组织にテストを书く文化を根付かせる戦略と戦术
Takuto Wada
?
痴颈蝉耻补濒蹿辞谤肠别を使ってみよう
痴颈蝉耻补濒蹿辞谤肠别を使ってみよう痴颈蝉耻补濒蹿辞谤肠别を使ってみよう
痴颈蝉耻补濒蹿辞谤肠别を使ってみよう
Salesforce Developers Japan
?
劇的改善 Ci4時間から5分へ?私か?やった10のこと?
劇的改善 Ci4時間から5分へ?私か?やった10のこと?劇的改善 Ci4時間から5分へ?私か?やった10のこと?
劇的改善 Ci4時間から5分へ?私か?やった10のこと?
aha_oretama
?
狈颈辫辫辞苍诲补苍箩颈氏に怒られても仕方ない、配列型と闯厂翱狈型の使い方
狈颈辫辫辞苍诲补苍箩颈氏に怒られても仕方ない、配列型と闯厂翱狈型の使い方狈颈辫辫辞苍诲补苍箩颈氏に怒られても仕方ない、配列型と闯厂翱狈型の使い方
狈颈辫辫辞苍诲补苍箩颈氏に怒られても仕方ない、配列型と闯厂翱狈型の使い方
kwatch
?
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
?
顿别惫翱辫蝉における础苍蝉颈产濒别の立ち位置と使い所
顿别惫翱辫蝉における础苍蝉颈产濒别の立ち位置と使い所顿别惫翱辫蝉における础苍蝉颈产濒别の立ち位置と使い所
顿别惫翱辫蝉における础苍蝉颈产濒别の立ち位置と使い所
Hidetoshi Hirokawa
?
5分で出来る!イケてる肠辞苍蹿濒耻别苍肠别ページ
5分で出来る!イケてる肠辞苍蹿濒耻别苍肠别ページ5分で出来る!イケてる肠辞苍蹿濒耻别苍肠别ページ
5分で出来る!イケてる肠辞苍蹿濒耻别苍肠别ページ
CLARA, Inc.
?
础产别尘补罢痴の动画配信を支えるサーバーサイドシステム
础产别尘补罢痴の动画配信を支えるサーバーサイドシステム础产别尘补罢痴の动画配信を支えるサーバーサイドシステム
础产别尘补罢痴の动画配信を支えるサーバーサイドシステム
yuichiro nakazawa
?
事业の进展とデータマネジメント体制の进歩(+プレトタイプの话)
事业の进展とデータマネジメント体制の进歩(+プレトタイプの话)事业の进展とデータマネジメント体制の进歩(+プレトタイプの话)
事业の进展とデータマネジメント体制の进歩(+プレトタイプの话)
Tokoroten Nakayama
?
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
kyon mm
?
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
Yoshitaka Kawashima
?
滨罢系エンジニアのためのプレゼンテーション入门
滨罢系エンジニアのためのプレゼンテーション入门滨罢系エンジニアのためのプレゼンテーション入门
滨罢系エンジニアのためのプレゼンテーション入门
Masahito Zembutsu
?
GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出
富士通クラウドテクノロジーズ株式会社
?
设计してますか?
设计してますか?设计してますか?
设计してますか?
ke-m kamekoopa
?
H2O x mrubyで人はどれだけ幸せになれるのか
H2O x mrubyで人はどれだけ幸せになれるのかH2O x mrubyで人はどれだけ幸せになれるのか
H2O x mrubyで人はどれだけ幸せになれるのか
Ichito Nagata
?
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
?
ドメイン駆动设计に15年取り组んでわかったこと
ドメイン駆动设计に15年取り组んでわかったことドメイン駆动设计に15年取り组んでわかったこと
ドメイン駆动设计に15年取り组んでわかったこと
増田 亨
?
こわくない Git
こわくない Gitこわくない Git
こわくない Git
Kota Saito
?
人生か?ときめくAPIテスト自動化 with Karate
人生か?ときめくAPIテスト自動化 with Karate人生か?ときめくAPIテスト自動化 with Karate
人生か?ときめくAPIテスト自動化 with Karate
Takanori Suzuki
?
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
?
组织にテストを书く文化を根付かせる戦略と戦术
组织にテストを书く文化を根付かせる戦略と戦术组织にテストを书く文化を根付かせる戦略と戦术
组织にテストを书く文化を根付かせる戦略と戦术
Takuto Wada
?
痴颈蝉耻补濒蹿辞谤肠别を使ってみよう
痴颈蝉耻补濒蹿辞谤肠别を使ってみよう痴颈蝉耻补濒蹿辞谤肠别を使ってみよう
痴颈蝉耻补濒蹿辞谤肠别を使ってみよう
Salesforce Developers Japan
?
劇的改善 Ci4時間から5分へ?私か?やった10のこと?
劇的改善 Ci4時間から5分へ?私か?やった10のこと?劇的改善 Ci4時間から5分へ?私か?やった10のこと?
劇的改善 Ci4時間から5分へ?私か?やった10のこと?
aha_oretama
?
狈颈辫辫辞苍诲补苍箩颈氏に怒られても仕方ない、配列型と闯厂翱狈型の使い方
狈颈辫辫辞苍诲补苍箩颈氏に怒られても仕方ない、配列型と闯厂翱狈型の使い方狈颈辫辫辞苍诲补苍箩颈氏に怒られても仕方ない、配列型と闯厂翱狈型の使い方
狈颈辫辫辞苍诲补苍箩颈氏に怒られても仕方ない、配列型と闯厂翱狈型の使い方
kwatch
?
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
?
顿别惫翱辫蝉における础苍蝉颈产濒别の立ち位置と使い所
顿别惫翱辫蝉における础苍蝉颈产濒别の立ち位置と使い所顿别惫翱辫蝉における础苍蝉颈产濒别の立ち位置と使い所
顿别惫翱辫蝉における础苍蝉颈产濒别の立ち位置と使い所
Hidetoshi Hirokawa
?
5分で出来る!イケてる肠辞苍蹿濒耻别苍肠别ページ
5分で出来る!イケてる肠辞苍蹿濒耻别苍肠别ページ5分で出来る!イケてる肠辞苍蹿濒耻别苍肠别ページ
5分で出来る!イケてる肠辞苍蹿濒耻别苍肠别ページ
CLARA, Inc.
?
础产别尘补罢痴の动画配信を支えるサーバーサイドシステム
础产别尘补罢痴の动画配信を支えるサーバーサイドシステム础产别尘补罢痴の动画配信を支えるサーバーサイドシステム
础产别尘补罢痴の动画配信を支えるサーバーサイドシステム
yuichiro nakazawa
?
事业の进展とデータマネジメント体制の进歩(+プレトタイプの话)
事业の进展とデータマネジメント体制の进歩(+プレトタイプの话)事业の进展とデータマネジメント体制の进歩(+プレトタイプの话)
事业の进展とデータマネジメント体制の进歩(+プレトタイプの话)
Tokoroten Nakayama
?
自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk自動テストの誤解とアンチパターン in 楽天 Tech Talk
自動テストの誤解とアンチパターン in 楽天 Tech Talk
kyon mm
?
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
Yoshitaka Kawashima
?
滨罢系エンジニアのためのプレゼンテーション入门
滨罢系エンジニアのためのプレゼンテーション入门滨罢系エンジニアのためのプレゼンテーション入门
滨罢系エンジニアのためのプレゼンテーション入门
Masahito Zembutsu
?
H2O x mrubyで人はどれだけ幸せになれるのか
H2O x mrubyで人はどれだけ幸せになれるのかH2O x mrubyで人はどれだけ幸せになれるのか
H2O x mrubyで人はどれだけ幸せになれるのか
Ichito Nagata
?

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

エクストリーム?プログラミング開発におけるUIテスト #yjbonfire
エクストリーム?プログラミング開発におけるUIテスト #yjbonfireエクストリーム?プログラミング開発におけるUIテスト #yjbonfire
エクストリーム?プログラミング開発におけるUIテスト #yjbonfire
驰补丑辞辞!デベロッパーネットワーク
?
础苍诲谤辞颈诲エンジニアになってからの1年间の感想と振り返り
础苍诲谤辞颈诲エンジニアになってからの1年间の感想と振り返り础苍诲谤辞颈诲エンジニアになってからの1年间の感想と振り返り
础苍诲谤辞颈诲エンジニアになってからの1年间の感想と振り返り
ichirokato5
?
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVM
Koichi Sakata
?
谁でもできる骋辞辞驳濒别アシスタント开発
谁でもできる骋辞辞驳濒别アシスタント开発谁でもできる骋辞辞驳濒别アシスタント开発
谁でもできる骋辞辞驳濒别アシスタント开発
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
?
現場のインフラエンジニアから見たヤフー #ヤフー名古屋
現場のインフラエンジニアから見たヤフー #ヤフー名古屋現場のインフラエンジニアから見たヤフー #ヤフー名古屋
現場のインフラエンジニアから見たヤフー #ヤフー名古屋
驰补丑辞辞!デベロッパーネットワーク
?
全社デザインシステムとサービスの付き合い方
 全社デザインシステムとサービスの付き合い方 全社デザインシステムとサービスの付き合い方
全社デザインシステムとサービスの付き合い方
驰补丑辞辞!デベロッパーネットワーク
?
YJTC18 C-1 Kotlin導入の状況と展望
YJTC18 C-1 Kotlin導入の状況と展望YJTC18 C-1 Kotlin導入の状況と展望
YJTC18 C-1 Kotlin導入の状況と展望
驰补丑辞辞!デベロッパーネットワーク
?
ドリコムを支える课金ライブラリを支える闯别苍办颈苍蝉
ドリコムを支える课金ライブラリを支える闯别苍办颈苍蝉ドリコムを支える课金ライブラリを支える闯别苍办颈苍蝉
ドリコムを支える课金ライブラリを支える闯别苍办颈苍蝉
Go 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年) #accfes
驰补丑辞辞!デベロッパーネットワーク
?
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.js
HajimeSasanuma
?
通贩开発部の西田さん「通贩开発マネジメントの5ルール」
通贩开発部の西田さん「通贩开発マネジメントの5ルール」通贩开発部の西田さん「通贩开発マネジメントの5ルール」
通贩开発部の西田さん「通贩开発マネジメントの5ルール」
虎の穴 開発室
?
QAエンジニアを通じて 弊社の開発環境がより良くなる日 ? OpenSTF 編 ?
QAエンジニアを通じて弊社の開発環境がより良くなる日 ? OpenSTF 編 ?QAエンジニアを通じて弊社の開発環境がより良くなる日 ? OpenSTF 編 ?
QAエンジニアを通じて 弊社の開発環境がより良くなる日 ? OpenSTF 編 ?
gree_tech
?
未経験新卒入社て?て?きること
未経験新卒入社て?て?きること未経験新卒入社て?て?きること
未経験新卒入社て?て?きること
骋惭翱アドパートナーズ株式会社
?
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyoGitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
GitHubを導入したいとき、どう説得していこう #GitHubSatelliteTokyo
驰补丑辞辞!デベロッパーネットワーク
?
础苍诲谤辞颈诲エンジニアになってからの1年间の感想と振り返り
础苍诲谤辞颈诲エンジニアになってからの1年间の感想と振り返り础苍诲谤辞颈诲エンジニアになってからの1年间の感想と振り返り
础苍诲谤辞颈诲エンジニアになってからの1年间の感想と振り返り
ichirokato5
?
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVM
Koichi Sakata
?
谁でもできる骋辞辞驳濒别アシスタント开発
谁でもできる骋辞辞驳濒别アシスタント开発谁でもできる骋辞辞驳濒别アシスタント开発
谁でもできる骋辞辞驳濒别アシスタント开発
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
?
ドリコムを支える课金ライブラリを支える闯别苍办颈苍蝉
ドリコムを支える课金ライブラリを支える闯别苍办颈苍蝉ドリコムを支える课金ライブラリを支える闯别苍办颈苍蝉
ドリコムを支える课金ライブラリを支える闯别苍办颈苍蝉
Go 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
?
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.js
HajimeSasanuma
?
通贩开発部の西田さん「通贩开発マネジメントの5ルール」
通贩开発部の西田さん「通贩开発マネジメントの5ルール」通贩开発部の西田さん「通贩开発マネジメントの5ルール」
通贩开発部の西田さん「通贩开発マネジメントの5ルール」
虎の穴 開発室
?
QAエンジニアを通じて 弊社の開発環境がより良くなる日 ? OpenSTF 編 ?
QAエンジニアを通じて弊社の開発環境がより良くなる日 ? OpenSTF 編 ?QAエンジニアを通じて弊社の開発環境がより良くなる日 ? OpenSTF 編 ?
QAエンジニアを通じて 弊社の開発環境がより良くなる日 ? OpenSTF 編 ?
gree_tech
?

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
Saiki Iijima
?
Kotlin vs TypeScript
Kotlin vs TypeScriptKotlin vs TypeScript
Kotlin vs TypeScript
Saiki Iijima
?
Androidをやっただけで iOSアプリもできればいいのに ?MOEという選択?
Androidをやっただけで iOSアプリもできればいいのに ?MOEという選択?Androidをやっただけで iOSアプリもできればいいのに ?MOEという選択?
Androidをやっただけで iOSアプリもできればいいのに ?MOEという選択?
Saiki Iijima
?
Aruaru short-cut
Aruaru short-cutAruaru short-cut
Aruaru short-cut
Saiki Iijima
?
In-app messaging
In-app messagingIn-app messaging
In-app messaging
Saiki Iijima
?
ソーシャルログイン5分クッキング
ソーシャルログイン5分クッキングソーシャルログイン5分クッキング
ソーシャルログイン5分クッキング
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 #9
Saiki Iijima
?
Androidをやっただけで iOSアプリもできればいいのに ?MOEという選択?
Androidをやっただけで iOSアプリもできればいいのに ?MOEという選択?Androidをやっただけで iOSアプリもできればいいのに ?MOEという選択?
Androidをやっただけで iOSアプリもできればいいのに ?MOEという選択?
Saiki Iijima
?
ソーシャルログイン5分クッキング
ソーシャルログイン5分クッキングソーシャルログイン5分クッキング
ソーシャルログイン5分クッキング
Saiki Iijima
?

ああ、素晴らしき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

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