Test
Overview
Test概念について。
Tips
E2E Test導入で嬉しいこと
メルペイのテスト方針
Test管理ツール(Excelとかで管理していたのをさらに管理する)
webアプリケーション開発で個人的に重視しているテストの話
E2E テストを導入するのか
テストの学び方
- 最初は簡単なアプリケーションから始めて、それをブラウザでテストする(もしくはAPIであれば、最近はPostmanのようなツールを使うこともあると思います)
- それから、小さな単位でテストを書き始めます。最初は明白な仕様をテストします。
- それからもっと複雑なテストを書く。
- 今度はその順番をひっくり返す。まずテストを書き、それからコードを書くのです。こうやっていくうちに、効果的なテストの書き方が身に付いていく。
テストの考え方
テストをしたというコードが残るのが何よりも良い。エビデンスになる。 APIテストのエンドポイントのメソッドでWeb APIをcallしているような場合は、それをmock化してWeb APIがcallされないようにすべき。
またRSpecの有名著者
- テストは信頼できるものであること
- テストは簡単に書けること
- テストは簡単に理解できること(今日も将来も)
つまりテストは自分に自信を付けさせるものであるべき
テストでそこまで考えなくていいもの
- スピードは重視しない
- テストの中では過度にDRYなコードを目指さない。 なぜならテストにおいてはDRYは必ずしも悪ではない。
Test フェーズ
- 単体テスト 一部分 ( モジュール内のクラスや関数 )のテスト
- 結合テスト 機能を結合したもの(単体テスト済みのモジュールを組み合わたもの)のテスト
- システムテスト システム全体(機能・非機能)のテスト
Test 概要
1. ユニットテスト
ユニットテストはJestを用いて、主にTypeScriptで記述された関数ロジックをテストする。
※Vuex、vueファイルは除く
2. インテグレーションテスト
インテグレーションテストは主にWebページ単位のテストで、Nuxtでいうところのpages配下のページコンポーネント単位のテストに相当します。Vueコンポーネントやユーティリティ関数、Nuxt middlewareやplugin、Vuex Storeなどページに含まれるものすべてが統合されます。ユニットテストで対象外としていた、コンポーネントやVuex Storeロジックもここで担保されます。Cypressを用いており、該当のアプリケーションと同じリポジトリにテストコードも置きます。
元々は Vue Test Utils などを用いてインテグレーションテストを行っていました。しかし、Nuxt 固有の処理や Vuex State、ブラウザ固有の処理のモックなど、テストのための設定が多くなってしまっていまいテスト運用に難がありました。代わりに Cypress を用いる方針に現在はシフトしています。Cypress の機能で API レスポンスだけモックし、それ以外はリアルなアプリケーションを実際のブラウザ上でテストすることができます。
3. シナリオテスト シナリオテストは予期している挙動すべてを確認するテスト QAチームがマニュアルで実施する。ある機能が追加・変更された時に全パターンを網羅的にテストする。 逆に言うと、ある機能が追加・変更されない限り、繰り返し実施されることはありません。現在、シナリオテストは自動化をしない方針です。仕様に変更があった場合の更新コストが大きく、かつCIとして実行し続けるにはシナリオテストケース数が膨大でテスト実行に時間がかかるためです。
インテグレーションテストとの違いはテスト対象です。インテグレーションテストはあくまでフロントエンドアプリケーション単体をテストするのに対して、シナリオテストは本番相当の環境を用いて、フロントエンドアプリケーションを介してバックエンドやインフラも総合してテストをします。
これに関してはユーザ操作が基本となるためユーザ操作の自動化であるWebアプリのUIテストが使える 基本操作ぐらいだよ 老舗Selenium
4. リグレッションテスト リグレッションテストは実装を変更した結果、アプリケーション全体の振 る舞いに予期せぬ影響がないかどうかを確認するテスト
単体テストでのネットワーク接続は?
そもそも単体テストではネットワーク接続はしない。 そのためモックを作成したりなどの方針をとる。
Test自動化 3つのステップ
テスト自動化には大きく3つのステップがある。
- テスト設計
- テストスクリプト作成
- CI環境構築
E2Eテスト(End to End)
E2EテストとはUI(User Interface)テストとも呼ばれ、システム全体を通してテストを行う。 Webサービスの場合はユーザと同じようにブラウザを操作し挙動が期待通りになっているかを確認すること。