matobaの学んだこと

とあるPythonエンジニアのブログ。ソフトウェア開発、執筆活動、ライフログ。

djangoでpytestを使いながらWebTestする

djangoでpytestを使いつつ、WebTestしたい。 どうしたらいいかなーと思ってた。とりあえず手元でやってみたときのメモ。

一言で言うとdjango-webtestの中にpytest.pluginが入ってたのでそれを使う。

github.com

というわけで、次のような感じで動かせる。

テストコード

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

余談

最近、個人で何かを作って見るときは次のような流れで書いている。

  1. 作りたいものを頭の中や机上で検証する。
  2. 作りたいものに必要な技術を集める。
  3. Djangoでガーーっとコードを書く。書きながらリファクタリングもする。
  4. WebTestを使って振る舞いからシナリオテストを書く。
  5. ClientかRequestFactoryでViewのテストを書く。
  6. リファクタリングで抽出した部分に対してユニットテストを追加する。

これがいいのかわからないけど、今のところ自分の性格にはあってそうな気がしている。 TDDも試したことがあって、ライブラリだといい感じだけど、アプリだとこっちの方がなんか好きな感じ。