[Django] LiveServerTestCaseを使ってSeleniumによるWeb動作テスト

DjangoのテストでSeleniumを使いたい場合、LiveServerTestCaseというクラスを継承すれば簡単に実装できます。

今回はログインが正常に出来るかを検証するテストを例にこのやり方を記載したいと思います。

なお今回利用するブラウザはChromeとなりますが、ドライバを変えれば他のブラウザでもテスト可能です。

テスト準備

PythonのSeleniumパッケージをインストールする。

pip install selenium

Chromeのドライバをダウンロードする。

以下のサイトからお使いのOSに対応したChromeドライバをダウンロードします。Chromeのバージョンと同じドライバをダウンロードする事にご留意下さい。

ChromeDriver
https://sites.google.com/a/chromium.org/chromedriver/home

「pip install chromedriver-binary」でChromeドライバを利用する事も出来ますが、Chromeのバージョンと不整合を起こしSeleniumが動かない可能性もありますのでドライバをダウンロードする方法をお薦めします。

 

テストコードを書く

Djangoアプリケーション生成時に自動で作られるtests.pyか「test_」で始まるPythonファイルにテストコードを書きます。

以下のコードはログインをテストするサンプルコードです。

from django.test import LiveServerTestCase
from django.urls import reverse_lazy
from selenium.webdriver.chrome.webdriver import WebDriver


class LoginTest(LiveServerTestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.selenium = WebDriver(executable_path='Chromeドライバのパス')

    @classmethod
    def tearDownClass(cls):
        cls.selenium.quit()
        super().tearDownClass()

    def test_login(self):
        # ログインページを開く
        self.selenium.get('http://localhost:8000' + str(reverse_lazy('login')))

        # ログイン
        username_input = self.selenium.find_element_by_name("username")
        username_input.send_keys('username')
        password_input = self.selenium.find_element_by_name("password")
        password_input.send_keys('password')
        self.selenium.find_element_by_class_name('btn').click()

        # ページタイトルの検証
        self.assertEquals('ログイン後ページ', self.selenium.title)

 

テストコードを動かす。

manage.pyのコマンドを使ってテストコードを動かします。

以下はappアプリケーションの下にあるtests.pyを動かす例です。

コマンドを実行するとChromeが起動してテストが自動で進みます。ブラウザからDjangoアプリケーションにアクセスするため、開発サーバーは別途起動しておく必要があります。

$ python3 manage.py test app.tests

 

sponsor