テストカバレッジ100%のプロジェクトで学んだ、 ユニットテストの書き方
by
yuto hara
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
Copyright © 2019 Classi Corp. All Rights Reserved. テストカバレッジ100%の プロジェクトで学んだ、 ユニットテストの書き方 2019/03/27 Classi Angular Night #2 原 悠人
Slide 2
Slide 2 text
Copyright © 2019 Classi Corp. All Rights Reserved. - 原悠人 - Classi 2019新卒 (2019/02 ~ Join) - リプレイスプロジェクトのフロントエンド担当 - プログラミング歴 1年半 - Angular歴 1年弱 1 自己紹介
Slide 3
Slide 3 text
Copyright © 2019 Classi Corp. All Rights Reserved. - 原悠人 - Classi 2019新卒 (2019/02 ~ Join) - リプレイスプロジェクトのフロントエンド担当 - プログラミング歴 1年半 - Angular歴 1年弱 - 昨日大学を卒業しました! 2 自己紹介
Slide 4
Slide 4 text
Copyright © 2019 Classi Corp. All Rights Reserved. はじめに ClassiにJoinして約2ヶ月。 今携わってるプロジェクトのこれめっちゃいいな と思ったところを紹介したいと思います! 3
Slide 5
Slide 5 text
Copyright © 2019 Classi Corp. All Rights Reserved. 4
Slide 6
Slide 6 text
Copyright © 2019 Classi Corp. All Rights Reserved. Renovateとは - パッケージの自動アップデートツール - 対象リポジトリの package.json を監視し、パッケージに更新があった場 合に Pull Request(PR) を作成してくれる - Renovateのおかげでアプリケーションが依存してるライブラリがほぼ最 新に保てる - 詳しくは https://qiita.com/kasaharu/items/1af74b49e98658cf9a8e 5
Slide 7
Slide 7 text
Copyright © 2019 Classi Corp. All Rights Reserved. 6
Slide 8
Slide 8 text
Copyright © 2019 Classi Corp. All Rights Reserved. 7 カバレッジ100%!!!
Slide 9
Slide 9 text
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジ100%の単体テスト - パッケージアップデート、機能追加の際の安心材料に 8
Slide 10
Slide 10 text
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジ100%の単体テスト - パッケージアップデート、機能追加の際の安心材料に - 他にもいいことがあるかも... ↑これが今日話したいことです 9
Slide 11
Slide 11 text
Copyright © 2019 Classi Corp. All Rights Reserved. ところで みなさんテスト書いてますか?? 10
Slide 12
Slide 12 text
Copyright © 2019 Classi Corp. All Rights Reserved. テスト難しいですよね - 僕はClassiに入るまで、書こう書こうと思って書けていませんでした。 - ng new した時を最後にテストがパスしなくなる。 - 既存の程よく育ったテストのないアプリだと、 どこから手をつけていいのかわららない 11
Slide 13
Slide 13 text
Copyright © 2019 Classi Corp. All Rights Reserved. そもそもテストとは - ユニットテスト component、serviceなどの振る舞いのテスト Jasmine(フレームワーク)とkarma(テストランナー)を使用 - End to Endテスト ブラウザの動きを再現してアプリケーションの動作を確認 (バックエンドとの通信なども) protractorを使用 どちらも@angular/cliが提供してくれる 12
Slide 14
Slide 14 text
Copyright © 2019 Classi Corp. All Rights Reserved. そもそもテストとは - ユニットテスト component、serviceなどの振る舞いのテスト Jasmine(フレームワーク)とkarma(テストランナー)を使用 今日はこっちの話をします - End to Endテスト ブラウザの動きを再現してアプリケーションの動作を確認 (バックエンドとの通信なども) protractorを使用 どちらも@angular/cliが提供してくれる 13
Slide 15
Slide 15 text
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト - なぜng newした時を最後にテストが通らなくなるのか 14
Slide 16
Slide 16 text
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト - なぜng newした時を最後にテストが通らなくなるのか - 依存関係を解決出来てないから 15
Slide 17
Slide 17 text
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト - なぜng newした時を最後にテストが通らなくなるのか - 依存関係を解決出来てないから - templateで依存している子componentをimportする。 - componentが利用しているmoduleをimportする。 16
Slide 18
Slide 18 text
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテスト - なぜng newした時を最後にテストが通らなくなるのか - 依存関係を解決出来てないから - templateで依存している子componentをimportする。 - NO_ERRORS_SCHEMAを利用する - componentが利用しているmoduleをimportする。 17
Slide 19
Slide 19 text
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
Slide 20
Slide 20 text
Copyright © 2019 Classi Corp. All Rights Reserved. こんな感じのテストコードが生成されてます 19
Slide 21
Slide 21 text
Copyright © 2019 Classi Corp. All Rights Reserved. テストを通すには ← beforeEach(async() => で依存関係を解決 20 ← beforeEach(async() => で依存関係を解決 ← beforeEach(() => でcomponentのインスタンスを 作成
Slide 22
Slide 22 text
Copyright © 2019 Classi Corp. All Rights Reserved. とりあえずテストが通るようになるはず 21
Slide 23
Slide 23 text
Copyright © 2019 Classi Corp. All Rights Reserved. どれくらいテストが書けてるか確かめる 22
Slide 24
Slide 24 text
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジの表示方法 angular.json 23
Slide 25
Slide 25 text
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジの表示方法 24
Slide 26
Slide 26 text
Copyright © 2019 Classi Corp. All Rights Reserved. カバレッジの表示方法 /coverage/{app-name}/index.html 25
Slide 27
Slide 27 text
Copyright © 2019 Classi Corp. All Rights Reserved. あとはカバレッジを高めるだけ 26
Slide 28
Slide 28 text
Copyright © 2019 Classi Corp. All Rights Reserved. コンポーネントでこんなメソッドを書いてないですか? routerからパラメータを受け取って、そのパラメータをパラメーターにして httpリクエストして、レスポンスのObservableをsubscribeして、表示用にデー タを整形してコンポーネントの変数に代入する。。 27
Slide 29
Slide 29 text
Copyright © 2019 Classi Corp. All Rights Reserved. コンポーネントでこんなメソッドを書いてないですか? routerからパラメータを受け取って、そのパラメータをパラメーターにして httpリクエストして、そのレスポンスのObservableをsubscribeして、表示用に データを整形してコンポーネントの変数に代入する。。 やりすぎで複雑なメソッドはテストがしづらい 28
Slide 30
Slide 30 text
Copyright © 2019 Classi Corp. All Rights Reserved. テストを書きやすくする - コンポーネントはロジック、状態をなるべく持たない - httpリクエストするメソッドはserviceで - httpレスポンスを整形するのはmapで - レスポンスのデータはserviceでBehaviorSubjectとして持つ コンポーネントはサービスのメソッドコール、serviceは 関数のテストで済む。 29
Slide 31
Slide 31 text
Copyright © 2019 Classi Corp. All Rights Reserved. そもそもユニットテストとは - component, service, pipe (reducer) などが、どんな振る舞いをするか確 認すること - それぞれのファイルがどんな仕事をするのかを簡潔に説明できれば、 テストがしやすいと言えるのではないか 30
Slide 32
Slide 32 text
Copyright © 2019 Classi Corp. All Rights Reserved. 例. リプレイスプロジェクトのコンポーネント設計 ディレクトリ構成 - pages/ - URLから取得するパラメータを引数にactionをdispatch(APIコール) - containers/ - storeから状態を取得(selector)しcomponentsへ渡す - components/ - containersから値を受け取り、表示する 役割が簡潔でわかりやすい。テストしやすい。 31
Slide 33
Slide 33 text
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテストがもたらすもの - パッケージアップデートや機能追加時の安心感 32
Slide 34
Slide 34 text
Copyright © 2019 Classi Corp. All Rights Reserved. ユニットテストがもたらすもの - パッケージアップデートや機能追加時の安心感 - テストを書きやすくするために考えることが、設計の見直しのチャンスに なる 33
Slide 35
Slide 35 text
Copyright © 2019 Classi Corp. All Rights Reserved. 今後の課題 - 現状ユニットテストのみ - ロジックしか見れていない - UIのテスト - スナップショットテスト - DOMの変更を検知するためのテスト - ビジュアルリグレッションテスト - 画像で見た目の変更を検知するテスト Jest使いたい 34
Slide 36
Slide 36 text
Copyright © 2019 Classi Corp. All Rights Reserved. 今後の課題 - 今は開発フェーズ - 仕様変更が無い(少ない)からカバレッジ100%でも辛く無い - 運用フェーズで仕様変更が頻発すると辛くなる? 35
Slide 37
Slide 37 text
Copyright © 2019 Classi Corp. All Rights Reserved. テストカバレッジ100%のメモ帳を作ったので よかったらご覧ください! https://github.com/hxrxchang/ng-test-sample 36
Slide 38
Slide 38 text
Copyright © 2018 Classi Corp. All Rights Reserved. 37 We are Hiring! Classiでは一緒に働く仲間を募集しています 詳細はWantedlyページにて https://www.wantedly.com/companies/classi/projects