Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
テストカバレッジ100%のプロジェクトで学んだ、 ユニットテストの書き方
Search
yuto hara
March 27, 2019
2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
テストカバレッジ100%のプロジェクトで学んだ、 ユニットテストの書き方
yuto hara
March 27, 2019
More Decks by yuto hara
See All by yuto hara
componentの分け方
hxrxchang
0
95
SPAの状態管理
hxrxchang
0
540
インドカレー屋で学ぶ非同期処理
hxrxchang
1
660
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
550
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
790
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
280
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
880
Paper Plane (Part 1)
katiecoart
PRO
0
9.4k
Google's AI Overviews - The New Search
badams
0
1.1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
Transcript
Copyright © 2019 Classi Corp. All Rights Reserved. テストカバレッジ100%の プロジェクトで学んだ、
ユニットテストの書き方 2019/03/27 Classi Angular Night #2 原 悠人
Copyright © 2019 Classi Corp. All Rights Reserved. - 原悠人
- Classi 2019新卒 (2019/02 ~ Join) - リプレイスプロジェクトのフロントエンド担当 - プログラミング歴 1年半 - Angular歴 1年弱 1 自己紹介
Copyright © 2019 Classi Corp. All Rights Reserved. - 原悠人
- Classi 2019新卒 (2019/02 ~ Join) - リプレイスプロジェクトのフロントエンド担当 - プログラミング歴 1年半 - Angular歴 1年弱 - 昨日大学を卒業しました! 2 自己紹介
Copyright © 2019 Classi Corp. All Rights Reserved. はじめに ClassiにJoinして約2ヶ月。
今携わってるプロジェクトのこれめっちゃいいな と思ったところを紹介したいと思います! 3
Copyright © 2019 Classi Corp. All Rights Reserved. 4
Copyright © 2019 Classi Corp. All Rights Reserved. Renovateとは -
パッケージの自動アップデートツール - 対象リポジトリの package.json を監視し、パッケージに更新があった場 合に Pull Request(PR) を作成してくれる - Renovateのおかげでアプリケーションが依存してるライブラリがほぼ最 新に保てる - 詳しくは https://qiita.com/kasaharu/items/1af74b49e98658cf9a8e 5
Copyright © 2019 Classi Corp. All Rights Reserved. 6
Copyright © 2019 Classi Corp. All Rights Reserved. 7 カバレッジ100%!!!
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジ100%の単体テスト -
パッケージアップデート、機能追加の際の安心材料に 8
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジ100%の単体テスト -
パッケージアップデート、機能追加の際の安心材料に - 他にもいいことがあるかも... ↑これが今日話したいことです 9
Copyright © 2019 Classi Corp. All Rights Reserved. ところで みなさんテスト書いてますか??
10
Copyright © 2019 Classi Corp. All Rights Reserved. テスト難しいですよね -
僕はClassiに入るまで、書こう書こうと思って書けていませんでした。 - ng new した時を最後にテストがパスしなくなる。 - 既存の程よく育ったテストのないアプリだと、 どこから手をつけていいのかわららない 11
Copyright © 2019 Classi Corp. All Rights Reserved. そもそもテストとは -
ユニットテスト component、serviceなどの振る舞いのテスト Jasmine(フレームワーク)とkarma(テストランナー)を使用 - End to Endテスト ブラウザの動きを再現してアプリケーションの動作を確認 (バックエンドとの通信なども) protractorを使用 どちらも@angular/cliが提供してくれる 12
Copyright © 2019 Classi Corp. All Rights Reserved. そもそもテストとは -
ユニットテスト component、serviceなどの振る舞いのテスト Jasmine(フレームワーク)とkarma(テストランナー)を使用 今日はこっちの話をします - End to Endテスト ブラウザの動きを再現してアプリケーションの動作を確認 (バックエンドとの通信なども) protractorを使用 どちらも@angular/cliが提供してくれる 13
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト -
なぜng newした時を最後にテストが通らなくなるのか 14
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト -
なぜng newした時を最後にテストが通らなくなるのか - 依存関係を解決出来てないから 15
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト -
なぜng newした時を最後にテストが通らなくなるのか - 依存関係を解決出来てないから - templateで依存している子componentをimportする。 - componentが利用しているmoduleをimportする。 16
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト -
なぜng newした時を最後にテストが通らなくなるのか - 依存関係を解決出来てないから - templateで依存している子componentをimportする。 - NO_ERRORS_SCHEMAを利用する - componentが利用しているmoduleをimportする。 17
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト -
なぜng newした時を最後にテストが通らなくなるのか - 依存関係を解決出来てないから - templateで依存している子componentをimportする。 - NO_ERRORS_SCHEMAを利用する - componentが利用しているmoduleをimportする。 - componentが依存しているserviceやstoreが使っている moduleもimportする必要がある (httpリクエストするserviceのメソッドをcallしてたり、 dispatchしたactionがそのserviceをcallする場合など) 18
Copyright © 2019 Classi Corp. All Rights Reserved. こんな感じのテストコードが生成されてます 19
Copyright © 2019 Classi Corp. All Rights Reserved. テストを通すには ←
beforeEach(async() => で依存関係を解決 20 ← beforeEach(async() => で依存関係を解決 ← beforeEach(() => でcomponentのインスタンスを 作成
Copyright © 2019 Classi Corp. All Rights Reserved. とりあえずテストが通るようになるはず 21
Copyright © 2019 Classi Corp. All Rights Reserved. どれくらいテストが書けてるか確かめる 22
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジの表示方法 angular.json
23
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジの表示方法 24
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジの表示方法 /coverage/{app-name}/index.html
25
Copyright © 2019 Classi Corp. All Rights Reserved. あとはカバレッジを高めるだけ 26
Copyright © 2019 Classi Corp. All Rights Reserved. コンポーネントでこんなメソッドを書いてないですか? routerからパラメータを受け取って、そのパラメータをパラメーターにして
httpリクエストして、レスポンスのObservableをsubscribeして、表示用にデー タを整形してコンポーネントの変数に代入する。。 27
Copyright © 2019 Classi Corp. All Rights Reserved. コンポーネントでこんなメソッドを書いてないですか? routerからパラメータを受け取って、そのパラメータをパラメーターにして
httpリクエストして、そのレスポンスのObservableをsubscribeして、表示用に データを整形してコンポーネントの変数に代入する。。 やりすぎで複雑なメソッドはテストがしづらい 28
Copyright © 2019 Classi Corp. All Rights Reserved. テストを書きやすくする -
コンポーネントはロジック、状態をなるべく持たない - httpリクエストするメソッドはserviceで - httpレスポンスを整形するのはmapで - レスポンスのデータはserviceでBehaviorSubjectとして持つ コンポーネントはサービスのメソッドコール、serviceは 関数のテストで済む。 29
Copyright © 2019 Classi Corp. All Rights Reserved. そもそもユニットテストとは -
component, service, pipe (reducer) などが、どんな振る舞いをするか確 認すること - それぞれのファイルがどんな仕事をするのかを簡潔に説明できれば、 テストがしやすいと言えるのではないか 30
Copyright © 2019 Classi Corp. All Rights Reserved. 例. リプレイスプロジェクトのコンポーネント設計
ディレクトリ構成 - pages/ - URLから取得するパラメータを引数にactionをdispatch(APIコール) - containers/ - storeから状態を取得(selector)しcomponentsへ渡す - components/ - containersから値を受け取り、表示する 役割が簡潔でわかりやすい。テストしやすい。 31
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテストがもたらすもの -
パッケージアップデートや機能追加時の安心感 32
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテストがもたらすもの -
パッケージアップデートや機能追加時の安心感 - テストを書きやすくするために考えることが、設計の見直しのチャンスに なる 33
Copyright © 2019 Classi Corp. All Rights Reserved. 今後の課題 -
現状ユニットテストのみ - ロジックしか見れていない - UIのテスト - スナップショットテスト - DOMの変更を検知するためのテスト - ビジュアルリグレッションテスト - 画像で見た目の変更を検知するテスト Jest使いたい 34
Copyright © 2019 Classi Corp. All Rights Reserved. 今後の課題 -
今は開発フェーズ - 仕様変更が無い(少ない)からカバレッジ100%でも辛く無い - 運用フェーズで仕様変更が頻発すると辛くなる? 35
Copyright © 2019 Classi Corp. All Rights Reserved. テストカバレッジ100%のメモ帳を作ったので よかったらご覧ください!
https://github.com/hxrxchang/ng-test-sample 36
Copyright © 2018 Classi Corp. All Rights Reserved. 37 We
are Hiring! Classiでは一緒に働く仲間を募集しています 詳細はWantedlyページにて https://www.wantedly.com/companies/classi/projects