こんにちは。
私は、現在派遣プログラマで、Web系を専門に活動しています。
私の職場では、サーバーサイド側をDjangoで開発しており、割と新しい技術を用いた開発業務に携われています。
本記事では、Djangoによるテスト駆動開発の方法について、書いていこうと思います。
<目次>
テスト駆動開発
テスト駆動開発では、以下の手順を繰り返します。
- テストコードを書く
- テストを実行し、「エラーになること」を確認する
- テストがpassするように「必要最低限」のプロダクトコードを書く
- テストを実行し、「passすること」を確認する
- リファクタリングする
詳しくは、実際に実装しながら確認していきましょう。
作成するアプリについて
本記事では、TODOリストを作成します。
事前準備
Pythonは既にインストールされていることを前提に話を進めます。また、動作環境はMacです。また、ブラウザは、Chromeを使います。
仮想環境の作成
1 2 3 4 5 6 7 8 9 10 |
# プロジェクトを作成 mkdir django-with-tdd cd django-with-tdd # 仮想環境を作成 python3 -m venv venv # 仮想環境に入る source venv/bin/activate |
Seleniumの準備
仮想環境を構築できたら、次にSeleniumのChrome Driverをダウンロードします。
Seleniumについては、後ほど解説します。
注意点としては、SeleniumのDriverには、OS(Windows, Mac, Linux)ごとの専用Driverがあり、かつ、Chromeのバージョンに気をつけなければなりません。
例えば、私の環境では、Chrome Driverのバージョンは以下のようになっています。

このChromeに対応するDriverは、こちらです。

「chromedriver_mac64」をダウンロードします。
このDriverを先ほど作成したvenvフォルダのbin配下に格納します。

モジュールのインストール
先ほど作成した仮想環境上で、次のモジュールをインストールします。
1 2 3 |
pip install django pip install selenium pip install pytest-django |
pytestは、pythonテストを強力にサポートしてくれるユーティリティです。
pytest-djangoは、djangoアプリに対して上pytestが実行できるツールです。
以下のファイルをdjango-with-tdd配下に作成しましょう。
1 |
touch pytest.ini |
このファイルは、pytestの設定ファイルです。以下の内容を書き込んでください。
1 2 3 4 5 |
[pytest] DJANGO_SETTINGS_MODULE = todos.settings python_classes = *Test python_functions = test_* python_files = tests.py test_*.py *_tests.py |
todosは、これから作るプロジェクトの名前です。
最初の機能テスト
機能テストでは、主にSeleniumを使ったブラウザテストを行います。Seleniumでは、本来なら人間が手動で実行しなければならないことを代わりに実行してくれる、便利なツールです。
以下のファイルをdjango-with-tdd配下に作成しましょう。
1 |
touch functional_tests.py |
テストコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 |
# functional_tests.py from selenium import webdriver # Selenium Driverを通して、ブラウザの動作を可能にする browser = webdriver.Chrome() # ブラウザを開く browser.get('http://localhost:8000') # ブラウザのタイトルがDjangoか確認する assert 'Django' in browser.title |
terminal上で、以下のコマンドを実行しましょう。一瞬だけブラウザが立ち上がり、テストが失敗するはずです。
1 2 3 4 |
pytest ERROR functional_tests.py - assert 'Django' in 'localhost' |
localhost:8000は、これから作成するDjangoアプリケーションのURLです。アプリケーションは、この後作成します。
TODOプロジェクトの作成
TODOプロジェクトを作成しましょう。
1 2 |
# . は、絶対に入れること django-admin.py startproject todos . |
このコマンドで、todosアプリが作成されたはずです。
1 2 3 4 5 6 7 8 9 10 11 |
tree -L 2 ├── functional_tests.py ├── manage.py ├── pytest.ini ├── todos │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── venv |
以下のコマンドで、アプリケーションを立ち上げましょう。
1 |
python manage.py runserver |
ブラウザからlocalhost:8000にアクセスします。

この状態で、別のterminal上で、pytestを実行してみましょう。
1 |
pytest |
今度は、以下のブラウザが立ち上がりっぱなしになるはずです。

テスト関数を作成していないのでテストは走りませんが、ひとまずこれでOKです。
まとめ
本記事では、テスト駆動開発の実行手順、環境構築、機能テストの触りの部分について解説しました。
次回も引き続き、TDDを通して、アプリケーション作りを進めて行きます。
コメントを残す
コメントを投稿するにはログインしてください。