pytest-djangoによるDjangoのテストについて
pytest-djangoのインストール
pip install pytest-django
でok。pytestもついでにインストールされる。
pip install pytest-mock
でmockも使えるようにしておくと吉
django用設定
djangoのプロジェクトフォルダ上にpytest.iniを作り
[pytest]
DJANGO_SETTINGS_MODULE=path.to.settings
と書いておく(これでsettings.pyを読み込んでくれる)
テストの記述場所
test_.pyか、_test.pyとかしておくとpytestコマンドを実行した場所以下のフォルダを探してテストしてくれる。 pytestコマンドでテストファイルの指定ができる
pytest test_hoge.py
#メソッドも指定する場合
pytest test_hoge.py::test_hoge
テストの記述方法
assertを記述すればとりあえずテストになる
def test_hoge():
assert True = True
viewsのテスト
viewsのテストをすることができる。テストの引数にclientを入れると、clientでget, postなどすることができるので、viewsのテストになる。 sessionの設定も可能(一つのメソッド内でのみsessionが保存される)
def test_hoge(client):
response = client.get('/')
assert response.status_code = 200
viewsにセッション情報を渡す
client.sessionが使えるが、
def test_hoge(client):
client.session['hoge'] = 'fuga'
response = client.get('/')
assert response.status_code = 200
assert client.session['hoge'] == 'fuga'
では上手くいかない。
def test_hoge(client):
session = client.session
session['hoge'] = 'fuga'
session.save()
response = client.get('/')
assert response.status_code = 200
assert client.session['hoge'] == 'fuga'
と、一手間必要。
参考:How to use session in TestCase in Django?、Django UnitTest - Setting session variable
mark
テストにメタデータを付与して、テストをスキップしたり、テストにパラメーターを付けたり色々なことができる
例:テストをスキップ
@pytest.mark.skip
def test_hoge(client):
pass
fixture
まだあまりわかってない。
テスト実行
#カレント以下の全テスト実行
pytest
#ファイル名指定
pytest test_hoge.py
#メソッドも指定する場合
pytest test_hoge.py::test_hoge
実行結果例(成功)
=========================================================================================== test session starts ============================================================================================
platform linux2 -- Python x.x.x, pytest-x.x.x, py-x.x.x, pluggy-x.x.x
django: settings: hoge.settings (from ini)
rootdir: /path/to/root, inifile: django-project.ini
plugins: mock-x.x.x, django-x.x.x
collected 1 item
test_hoge.py . [100%]
========================================================================================= 1 passed in 0.17 seconds =========================================================================================
実行結果例(失敗)
=========================================================================================== test session starts ============================================================================================
platform linux2 -- Python x.x.x, pytest-x.x.x, py-x.x.x, pluggy-x.x.x
django: settings: hoge.settings (from ini)
rootdir: /path/to/root, inifile: django-project.ini
plugins: mock-x.x.x, django-x.x.x
collected 1 item
test_sample.py F
=================================== FAILURES ===================================
_________________________________ test_assert __________________________________
def test_assert():
> assert f() == 2
E assert 3 == 2
E + where 3 = f()
test_sample.py:14: AssertionError
================ 1 failed skipped in 0.20 seconds ================
こんな感じで失敗したコード、どうエラーが出たかなど出してくれる。views内でエラーが出た場合も出力してくれる。