Weitere ähnliche Inhalte
Ähnlich wie Selenium WebDriver + python で E2Eテスト自動化 (20)
Mehr von JustSystems Corporation (20)
Selenium WebDriver + python で E2Eテスト自動化
Hinweis der Redaktion
- それでは、Selenium WebDriverとPythonでE2Eテスト自動化のお話しをさせていただきます。小池です。よろしくお願いします。
- まず簡単に自己紹介ですが、私自身はBtoB向けのWebアプリケーションの開発を行っていました。
直近1年ほどは営業管理システムのJUST.SFAの品質保証担当になり、その一環としてテスト自動化の検討から実施までを行っています。
・
JUST.SFAですが、不具合によってはユーザーの業務が止まってしまうこともあるので、品質は非常に重要です。
また、様々な機能が使えてかつ用途に合わせたカスタマイズができる、という商品性のため、設定できる組み合わせが膨大となっています。
さらに、昨年7月にリリースした商品であることもあり、今後機能追加をどんどん行うため、リリース頻度を上げたいという要件もあります。
・
そのため、テストの自動化が望まれますが、多機能で組み合わせ多数ということもあり、単体テストだけではカバーが難しいため、
E2Eテストの自動化を行うことになりました。
E2Eテストとは、画面上の操作から画面上のアウトプットでの検証のことで、外部仕様を満たすことを確認するものになります。
- E2Eテストの自動化ですが、難しいものです。
・
まず、操作を「実装する」必要があると言うことが上げられます。
よくある誤解として、ブラウザ上での操作を記録・再生するだけではないのか?という考えを持っている人がいますが、実際は
「どの要素」を「どう操作するか」の実装をしていく必要があります。
・
たとえば、保存ボタンをクリックするためには、保存ボタンをCSS SelectorやXpathで取得し、その要素に対してクリックを実行する
というのをスクリプトで書いていくことになります。
また、操作は1つの操作で完結することはなく、基本的にはステップを踏むものになります。
たとえば、編集画面を表示して、フォームの入力値を変更して、保存ボタンを押して、閲覧画面が表示される、といった形です。
このときに、タイミング問題として、次の操作をするときにまだ描画が完了していない、ということが発生することがあります。
編集画面を表示した後、まだ表示されていない入力フォームにキー入力しようとすると、要素が見つからずにテストが失敗してしまいます。
これは操作と操作の間にwaitを入れることで回避しますが、このような問題でテストが失敗する場合がある、というのは
前提として考えておく必要があります。
- また、何を正解とするか?どう検証するか?を検討して実装する必要がある、というのも難しさの1つです。
よく出てくる話として画像比較がありますが、これは肉眼では全く同じに見える場合でもピクセル単位のずれが多く発生してしまう場合が多々あり、安定しません。
そのため、要素から取得される値を比較する必要がありますが、このためには操作と同様の実装に加えて、その値がどうなっていればテストOKとするか、というのを検討する必要があります。
- これらを踏まえると、方針としては「操作」「検証」の内容を限定することが重要になります。
この中で効果を出すために、データのパターンに対して同じ操作手順を繰り返し行う必要があるようなテストに限定します。
操作手順をシナリオとしてスクリプトで実装し、そこにデータを食わせていくことで、手動では困難な膨大なパターンに対するテストを自動で行える様になります。
- ここからはタイトルの内容について、実装部分を説明します。
- まず、Selenium WebDriverですが、これは自動化ツールとして最もメジャーなものですが、ブラウザ上の操作を実現するライブラリと考えると良いと思います。
主要言語で提供されています。
- テストスクリプトはブラウザとは完全に切り離して実装するため、好きな言語を使えます。
今回の場合、Pythonを選択しました。
それと、自動テストなのでテストフレームワークを利用すると良いです。
今回はpytestを利用します。
pytestはテスト結果をjUnit形式で出力してくれるので、CIと連携して結果の表示もできます。
- フォルダ構成としてはこのようになっています。
テストランナーで、テストケースを表すデータを読み込み、対象のシナリオで実行します。
また、Seleniumの王道のデザインパターンであるPageObjectパターンも利用します。
画面をオブジェクトと扱うことで、特定の要素に対する操作を一元管理できます。
今回、テストケースに関してはyamlで記述します。
シナリオはそれぞれスクリプトで書いていきますが、共通処理をかいたClassを全シナリオに継承させる、ということをしています。
- 具体的なスクリプトも紹介したいのですが、時間の都合上省略します。発表資料は後程公開しますので、詳細はそちらでご確認ください。
- このように実装したものを、以下のコマンドで実行できます。
JUnit形式の結果出力をオプションで指定しています。
Jenkinsではこのように結果を一覧で見ることができます。
- これをCIに組み込むことですが、自動テストを形骸化させないために、非常に重要になります。
1日1回自動実行させるようにして、テストNGがあれば担当者に通知します。
テストNGを必ず解決することも重要です。
- 最後に、E2Eテストのポイントをまとめておきます。
以上です。ありがとうございました。