概要
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
テストコードの作成
- テスト用のコードは別に分けておくことが一般的なので、プロジェクトのルートに
tests
ディレクトリを作成 - ユニットテストと切り分けるため、
tests
ディレクトリ内にselenium
ディレクトリを作成 -
SeleniumBaseのリポジトリの
example
ディレクトリを参考にsetup.cfg
ファイルを(プロジェクトのルート)/tests/selenium
ディレクトリ内に作成(このファイルが無いとテストの実行自体に失敗します) - 実施したいテストコードを記述した
.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を用いない単純なテストなら、こちらの方が実装は簡単そうです。