Selenium + pytestを使ってUI自動テストを書いてみる

環境

準備

pipモジュールのインストール

まずは今回必要な最低限のpipモジュールをインストールします。

$ pip install pytest selenium

$ pip list

pytest (4.0.2)
selenium (3.141.0)
ChromeDriverの準備

続いてChromeDriverをdriverをインストールしましょう。 ChromeDriverはseleniumAPI経由でchrome driverをお話するためのドライバになりますので、インストールは必須となります。

まずはChromeDriverを以下からダウンロードしましょう。

Downloads - ChromeDriver - WebDriver for Chrome

今日時点で最新のバージョンは2.45のようです。v2.45がサポートしているChromeのバージョンはv70-v72のようで、私の環境のChromeもサポート範囲内なので、これを使いたいと思います。

OS毎にバイナリが異なりますので、今回はmacOS用をダウンロードします。

zipファイルを解凍し、適当なところに置いておきます。

テストスクリプトを書いてみる

さっそくテストスクリプトを書いてみましょう。今回は題材としてgoogleのホームページを選びました。

例題として、今回はGoogleのホームページを開いて、検索用のインプットフィールドに文字を入力して、その入力が正しく行われたかを確認しましょう。

説明のため、まず完成したコードを示した上で、1行ずつかいつまんで説明していきたいと思います。

  • 5行目:pytestはtest_*** という名前の関数をテストの対象として判断しますので、今回はtest_googleという関数としてテストを作成しています。
  • 6行目:ここではwebdriverの初期化を行っています。準備でダウンロードしたchromedriverがPATHの通った場所においてあれば、初期化の際に渡すパラメータは空でも大丈夫です。私の環境はCHROME_DRIVER_PATHという環境変数にそのPATHを記載しているので、その環境変数をexecutable_pathに渡しています。
  • 7行目:6行目で初期化したdriverに対してgetのメンバー関数をURLを指定した形で呼び出すことで、ブラウザを起動し指定のURLに飛ぶことができます。
  • 8行目:今回は検索フィールドに対して文字を入力をする必要があるので、まず検索フィールドのElementをfind_element_by_nameの関数を利用して見つけに行きます。Chromeデベロッパーツールを立ち上げて検索フィールドのElementについて調べるとname属性としてqがついているのがわかります(以下のスクショを参照ください)。 f:id:siro_uma:20181225221610p:plain:w400
  • 10行目:8行目で検索フィールドのElementが取得できたので、そのElementに対してsend_keysを使い文字の入力ができます。
  • 11行目:send_keysで正しく文字が入力されたかを確認するために、Elementのvalueのattributeをget_attributeを使い取得し、assertを用いた形で、Stringリテラルとの比較を行っています。
  • 12行目:終了処理です。ブラウザを閉じます。

テストの実行

pytestの実行は、pytestの後に対象のpyファイルを指定するだけで実行可能です。

$ pytest test_google.py 
=========================================================================================== test session starts ============================================================================================
platform darwin -- Python 3.6.4, pytest-4.0.2, py-1.7.0, pluggy-0.8.0
rootdir: /Users/ihysk/workspace/pytest, inifile:
collected 1 item                                                                                                                                                                                           

test_google.py .                                                                                                                                                                                     [100%]

========================================================================================= 1 passed in 5.62 seconds =========================================================================================

まとめ

10行程度のプログラムで簡単にUI自動試験が実施できてしまいました。 ただし、今回のテストは非常にシンプルなもので、実際の開発現場ではもっと大規模なテストが行われていると思います。

大規模なテストをPytest + seleniumで書く場合どのような点に気をつければ良いか、どのような実装が必要なのかについて、別の記事で順に説明していきたいと思います。

ということで、今日はここまで。みなさんも、Pytest + seleniumで自動試験にチャレンジしてみてください。