SlideShare a Scribd company logo
1 of 35
Download to read offline
1
アプリケーション開発目線から考える
テストの書き方について
2
@kou
3
今日話すこと
● テストのメンテナンスが負担にならないようにするには ?
● サンプルコードでいくつかのテストの書き方の紹介
4
テストのメンテナンスが負担にならないようにするには?
そもそもなぜ負担になってしまうのか ?
5
テストのメンテナンスが負担にならないようにするには?
そもそもなぜ負担になってしまうのか ?
テストを書くのが楽しくないから
6
テストのメンテナンスが負担にならないようにするには?
そもそもなぜ負担になってしまうのか ?
テストを書くのが楽しくないから
● Karmaが遅い
● DIの設定がめんどくさい
7
テストのメンテナンスが負担にならないようにするには?
そもそもなぜ負担になってしまうのか ?
テストを書くのが楽しくないから
● Karmaが遅い
● DIの設定がめんどくさい
この辺が解消されれば
楽しくなるはず!
8
Jestを使おう
● ブラウザを立ち上げる必要がないので、 Karmaよりも圧倒的に速い
● 後述するSnapshotテストが強力で、テスト工数がだいぶ低くなる
● Jasmineよりも分かりやすいMock機能がある
● IDEの親和性も高い
9
Jestを使ったテストの書き方を紹介
● Component Template テスト
● Component @Output テスト
● テスト時のDIのモック設定
● Http/Observableのテスト
10
Component Template テスト
● プロパティがHTMLとして正しくレンダリングされているかを確認したい
● プロパティ一箇所ごとにテストを書くのは大変で、テストも腐りやすい
● Jest Snapshotでテストをしよう
11
12
class名が設定されること
をテストしたい
13
class名が設定されること
をテストしたい
レンダリング内容でファイルが
生成され、そのファイルとの比較
テストが行われる
14
class名が設定されること
をテストしたい
15
class名が正しく設定されることを確認
class名が設定されること
をテストしたい
16
Component @Output テスト
● ユーザーのクリックなどの処理で EventEmitterがemitされることを確認した
い
● Observableとしてテストをするのは手数が多く面倒くさい
● JestのspyOnを使用してemitが呼ばれるところまでをテストをする
17
18
methodのコールで
このemit が呼ばれること
をテストしたい
19
methodのコールで
このemit が呼ばれること
をテストしたい
EventEmitterの emit を spyする
20
methodのコールで
このemit が呼ばれること
をテストしたい
EventEmitterの emit を spyする
emitを発火させるmethodをコールする
21
methodのコールで
このemit が呼ばれること
をテストしたい
EventEmitterの emit を spyする
emitを発火させるmethodをコールする
意図通りにemitが呼ばれることを確認
22
テスト時のDIのモック設定
● DIするものが増えるとテストを書くモチベーションが下がってしまう
● 使い捨てで、すぐに準備できるように DIを上手く解決したい
● DIするモックについては再利用を考えず、それぞれのファイル作成する
● Provider の useValue と jest.fn を使う
23
24
これらのdependencyを解
決したい
25
これらのdependencyを解
決したい
providersにはuseValue を使用し、
必要なmethodなどを jest.fn で用意する
26
これらのdependencyを解
決したい
providersにはuseValue を使用し、
必要なmethodなどを jest.fn で用意する
Serviceの DI が解決されてnew できる
27
Http/Observableのテスト
● Httpのリクエスト結果を利用した処理などをテストしたい
● HttpClientTestingModuleを使うと煩雑な設定が多くなり、
テストを書くのが億劫になってしまう
● HttpClientの get をモック化して、コールされた内容をテスト
戻り値には jest.fn を使用して、必要なObservableを設定する
28
29
指定のIDのUserの名前を取得するmethod
Userの名前を取得できることをテストしたい
30
指定のIDのUserの名前を取得するmethod
Userの名前を取得できることをテストしたい
HttpClientに正しく引数を渡せてい
るかテストする
31
指定のIDのUserの名前を取得するmethod
Userの名前を取得できることをテストしたい
HttpClientに正しく引数を渡せてい
るかテストする
正しくコールされていることを確認
32
指定のIDのUserの名前を取得するmethod
Userの名前を取得できることをテストしたい
HttpClientに正しく引数を渡せてい
るかテストする
正しくコールされていることを確認
Httpの結果を正しく操作していることを
テストする
33
指定のIDのUserの名前を取得するmethod
Userの名前を取得できることをテストしたい
HttpClientに正しく引数を渡せてい
るかテストする
正しくコールされていることを確認
Httpの結果を正しく操作していることを
テストする
正しくオブジェクトから名前だけを戻しているこ
とを確認
34
まとめ
● 表示専用のComponentのテストは、Jest Snapshotを使う
● DIは各テストファイルで、最小限のモックを jest.fn で作成する
● モックに対して指定の引数で正しくコールしているかどうかのテストを行う
● モックからの戻り値は jest.fn で随時設定して、各テストを進めていく
35
ありがとうございました

More Related Content

Similar to アプリケーション開発目線から考える テストの書き方について

20121019 jenkins勉強会lt資料
20121019 jenkins勉強会lt資料20121019 jenkins勉強会lt資料
20121019 jenkins勉強会lt資料Hiroko Tamagawa
 
Reducing the operational load of rpa
Reducing the operational load of rpaReducing the operational load of rpa
Reducing the operational load of rpassuser033561
 
iOSアプリの自動テストをはじめよう
iOSアプリの自動テストをはじめようiOSアプリの自動テストをはじめよう
iOSアプリの自動テストをはじめようToshiyuki Hirata
 
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12学 松崎
 
TDDってなんなの?(What is TDD)
TDDってなんなの?(What is TDD)TDDってなんなの?(What is TDD)
TDDってなんなの?(What is TDD)seichi23
 
レガシーコード読書会 20120618
レガシーコード読書会 20120618レガシーコード読書会 20120618
レガシーコード読書会 20120618Suguru Shirai
 
nGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テストnGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テストJunHo Yoon
 
Dev Love Lt 20090622(佐々木)
Dev Love Lt 20090622(佐々木)Dev Love Lt 20090622(佐々木)
Dev Love Lt 20090622(佐々木)DevLOVE
 
Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016kyon mm
 
TDDはじめる前に
TDDはじめる前にTDDはじめる前に
TDDはじめる前にYasui Tsutomu
 
OutSystems Workflow Builder
OutSystems Workflow BuilderOutSystems Workflow Builder
OutSystems Workflow BuilderTetsuo Ajima
 
TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~
TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~
TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~Tomomi Kajita
 
Node塾 講義その6 テスト駆動java script 読書会 1回目
Node塾 講義その6 テスト駆動java script 読書会 1回目Node塾 講義その6 テスト駆動java script 読書会 1回目
Node塾 講義その6 テスト駆動java script 読書会 1回目Nomo Kiyoshi
 
SEゼミ2015 - 練習
SEゼミ2015 - 練習SEゼミ2015 - 練習
SEゼミ2015 - 練習Kouhei Sutou
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進めDai FUJIHARA
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進めRakuten Group, Inc.
 
ユニットテストをちゃんとした話
ユニットテストをちゃんとした話ユニットテストをちゃんとした話
ユニットテストをちゃんとした話Tsuyoshi Nakamura
 
Selenium Antipatterns
Selenium AntipatternsSelenium Antipatterns
Selenium AntipatternsJumpei Miyata
 
GCSアジャイル開発を使ったゲームの作り方
 GCSアジャイル開発を使ったゲームの作り方 GCSアジャイル開発を使ったゲームの作り方
GCSアジャイル開発を使ったゲームの作り方Hiroyuki Tanaka
 

Similar to アプリケーション開発目線から考える テストの書き方について (20)

20121019 jenkins勉強会lt資料
20121019 jenkins勉強会lt資料20121019 jenkins勉強会lt資料
20121019 jenkins勉強会lt資料
 
Reducing the operational load of rpa
Reducing the operational load of rpaReducing the operational load of rpa
Reducing the operational load of rpa
 
iOSアプリの自動テストをはじめよう
iOSアプリの自動テストをはじめようiOSアプリの自動テストをはじめよう
iOSアプリの自動テストをはじめよう
 
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
 
TDDってなんなの?(What is TDD)
TDDってなんなの?(What is TDD)TDDってなんなの?(What is TDD)
TDDってなんなの?(What is TDD)
 
レガシーコード読書会 20120618
レガシーコード読書会 20120618レガシーコード読書会 20120618
レガシーコード読書会 20120618
 
nGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テストnGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テスト
 
Dev Love Lt 20090622(佐々木)
Dev Love Lt 20090622(佐々木)Dev Love Lt 20090622(佐々木)
Dev Love Lt 20090622(佐々木)
 
Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016Scrum,Test,Metrics #sgt2016
Scrum,Test,Metrics #sgt2016
 
TDDはじめる前に
TDDはじめる前にTDDはじめる前に
TDDはじめる前に
 
OutSystems Workflow Builder
OutSystems Workflow BuilderOutSystems Workflow Builder
OutSystems Workflow Builder
 
Sue445 Style TDD #atest_hack
Sue445 Style TDD #atest_hackSue445 Style TDD #atest_hack
Sue445 Style TDD #atest_hack
 
TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~
TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~
TDDを一年やってみました ~シロート集団がTDDをやってはまったこと~
 
Node塾 講義その6 テスト駆動java script 読書会 1回目
Node塾 講義その6 テスト駆動java script 読書会 1回目Node塾 講義その6 テスト駆動java script 読書会 1回目
Node塾 講義その6 テスト駆動java script 読書会 1回目
 
SEゼミ2015 - 練習
SEゼミ2015 - 練習SEゼミ2015 - 練習
SEゼミ2015 - 練習
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め
 
地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め地図を捨ててコンパスを頼りに進め
地図を捨ててコンパスを頼りに進め
 
ユニットテストをちゃんとした話
ユニットテストをちゃんとした話ユニットテストをちゃんとした話
ユニットテストをちゃんとした話
 
Selenium Antipatterns
Selenium AntipatternsSelenium Antipatterns
Selenium Antipatterns
 
GCSアジャイル開発を使ったゲームの作り方
 GCSアジャイル開発を使ったゲームの作り方 GCSアジャイル開発を使ったゲームの作り方
GCSアジャイル開発を使ったゲームの作り方
 

More from bitbank, Inc. Tokyo, Japan

ビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてbitbank, Inc. Tokyo, Japan
 
ビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfbitbank, Inc. Tokyo, Japan
 
ビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントbitbank, Inc. Tokyo, Japan
 
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境bitbank, Inc. Tokyo, Japan
 
ビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfbitbank, Inc. Tokyo, Japan
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略bitbank, Inc. Tokyo, Japan
 
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜bitbank, Inc. Tokyo, Japan
 
中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計bitbank, Inc. Tokyo, Japan
 
仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践 仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践 bitbank, Inc. Tokyo, Japan
 
Introduction of bitbank frontend development environment
Introduction of bitbank frontend development environmentIntroduction of bitbank frontend development environment
Introduction of bitbank frontend development environmentbitbank, Inc. Tokyo, Japan
 
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかDeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかbitbank, Inc. Tokyo, Japan
 
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介	ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介 bitbank, Inc. Tokyo, Japan
 
TypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようTypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようbitbank, Inc. Tokyo, Japan
 

More from bitbank, Inc. Tokyo, Japan (20)

インフラチームの歴史とこれから
インフラチームの歴史とこれからインフラチームの歴史とこれから
インフラチームの歴史とこれから
 
ビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略について
 
ビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdf
 
ビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメント
 
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
 
ビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdf
 
Lightning Network, Swap, Nloop
Lightning Network, Swap, NloopLightning Network, Swap, Nloop
Lightning Network, Swap, Nloop
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略
 
bitbank Corporate Information
bitbank Corporate Informationbitbank Corporate Information
bitbank Corporate Information
 
ng build --prod & Continuous Delivery
ng build --prod & Continuous Deliveryng build --prod & Continuous Delivery
ng build --prod & Continuous Delivery
 
マーブル図で怖くないRxJS
マーブル図で怖くないRxJSマーブル図で怖くないRxJS
マーブル図で怖くないRxJS
 
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
 
中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計
 
仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践 仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践
 
Introduction of bitbank frontend development environment
Introduction of bitbank frontend development environmentIntroduction of bitbank frontend development environment
Introduction of bitbank frontend development environment
 
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかDeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
 
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介	ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
 
Ethereumのシャーディング概論
Ethereumのシャーディング概論Ethereumのシャーディング概論
Ethereumのシャーディング概論
 
Daocasinoにおけるstate channel実装
Daocasinoにおけるstate channel実装Daocasinoにおけるstate channel実装
Daocasinoにおけるstate channel実装
 
TypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようTypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみよう
 

アプリケーション開発目線から考える テストの書き方について