【Python】【Selenium-webdriver】Webテスト自動化の第1歩


概要

Webの目視テストが苦手なので、PythonのWebアプリでのテストをSeleniumで自動化しよう。という話の初歩です。

環境

  • Python 3.7
  • Chrome 75.0
  • Django 2.2.2

手順

テストしたいWebアプリの構築

DjangoによるWebアプリケーション開発入門を参考にして、「Hello World!」を表示するだけのWebアプリを作成。

Selenium-webdriverの導入

pip install selenium

chrome-binaryの導入

【Python】SeleniumでHeadless Chromeを使おうの記事を参考にして導入。
SeleniumでChromeを動かす場合は必要です。
インストールしているChromeとバージョンが異なると起動しないので、Chromeのバージョンは要確認。
今回はインストールしているChromeのバージョンが75.0なので、同じメジャーバージョンのchrome-binaryをバージョン指定で導入。

pip install chromedriver-binary==75.0.3770.8.0

SeleniumBaseの導入

Awesome Selenium : 素晴しい Selenium ライブラリの数々を参考に導入。
pytestコマンドを使ってseleniumでのテストを自動実行するためのフレームワーク。

pip install seleniumbase

テストコードの作成

  1. テスト用のコードは別に分けておくことが一般的なので、プロジェクトのルートにtestsディレクトリを作成
  2. ユニットテストと切り分けるため、testsディレクトリ内にseleniumディレクトリを作成
  3. SeleniumBaseのリポジトリexampleディレクトリを参考にsetup.cfgファイルを(プロジェクトのルート)/tests/seleniumディレクトリ内に作成(このファイルが無いとテストの実行自体に失敗します)
  4. 実施したいテストコードを記述した.pyファイルを(プロジェクトのルート)/tests/seleniumディレクトリ内に作成
    今回はHello World!の表示を確認したいのでhello_tests.pyというファイルを作成
from seleniumbase import BaseCase
import chromedriver_binary

class HelloTestClass(BaseCase):
    BASE_URL = 'http://127.0.0.1:8000/'

    def test_hello(self):
        self.open(self.BASE_URL + 'hello/')
        self.assert_text('Hello World!', 'body')

テストの実行

  • (今更かもしれませんが)DjangoのWebアプリケーションを立ち上げる
python mysite/manage.py runserver
  • pytestコマンドからSeleniumの自動テストを実行する
    • --browser=BROWSERオプション:BROWSER部分に実行するブラウザを指定。今回はChromeを使うので--browser=chromeで指定する。
    • --headlessオプション:このオプションを付けると、ヘッドレスモードで実行。
cd ./tests/selenium
pytest hello_tests.py --browser=chrome --headless
  • 実行結果を確認する

追記

公式ドキュメントをよく読んでみたら、こんな項が……
Django におけるテスト

django.testパッケージ内のSimpleTestCaseクラス、またはそのサブクラスを継承するテストクラスを定義することで、Webサーバを起動せずにWebアプリの基本的なテストを実行できる。

アプリケーション内にテストクラスを定義した場合の実行コマンドは

[プロジェクトのディレクトリ]/manage.py test [テスト対象のアプリケーション]

テストクラスを別パッケージに分けた場合の実行コマンドは

[プロジェクトのディレクトリ]/manage.py test [テストクラスのパッケージのディレクトリ]

でテストを実行できる。

アプリケーション単位にテストクラスを定義する場合は、アプリケーションのディレクトリ内にtests.pyを作成し、その中に定義するのが慣習。
デフォルトのテストスクリプトのファイル検出パターンはtest*.py
テストスクリプトのファイル検出パターンを変更する場合は--pattern=[ファイル名パターン]または-p=[ファイル名パターン]で指定する。
Seleniumを用いない単純なテストなら、こちらの方が実装は簡単そうです。