pytest-djangoによるDjangoのテストについて

pytest-djangoのインストール

pip install pytest-django

でok。pytestもついでにインストールされる。

pip install pytest-mock

でmockも使えるようにしておくと吉 

pytest-djangoドキュメント

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内でエラーが出た場合も出力してくれる。