djangoでpytestを使いつつ、WebTestしたい。 どうしたらいいかなーと思ってた。とりあえず手元でやってみたときのメモ。
一言で言うとdjango-webtestの中にpytest.pluginが入ってたのでそれを使う。
というわけで、次のような感じで動かせる。
テストコード
import pytest from django.urls import reverse from myapp.models import MyModel @pytest.mark.django_db def test_standard_scenario(django_app) # formを取得する form = django_app.get(reverse('index_form')).form # formに値を入れる form['name'] = 'test_user' form['password'] = 'test_password' # 送信して追いかける response = form.submit().follow() # usernameにtest_userが入ってるページにリダイレクトされている assert response.context['user'].username == 'test_user' # DBにデータが格納されている assert MyModel.objects.filter(name="test_user")
当然ながら、以下のようなライブラリのインストールや設定は必要。
pip install pytest pip install pytest-django pip install django-webtest
pytest.ini
[pytest] DJANGO_SETTINGS_MODULE = myproject.settings_test python_files = tests.py test_*.py *_tests.py
余談
最近、個人で何かを作って見るときは次のような流れで書いている。
- 作りたいものを頭の中や机上で検証する。
- 作りたいものに必要な技術を集める。
- Djangoでガーーっとコードを書く。書きながらリファクタリングもする。
- WebTestを使って振る舞いからシナリオテストを書く。
- ClientかRequestFactoryでViewのテストを書く。
- リファクタリングで抽出した部分に対してユニットテストを追加する。
これがいいのかわからないけど、今のところ自分の性格にはあってそうな気がしている。 TDDも試したことがあって、ライブラリだといい感じだけど、アプリだとこっちの方がなんか好きな感じ。