Djangoでテストコードを書く

2017年5月10日

PythonでDjangoを使う時のテストコードの書き方をまとめました。

目的

  • ローカル環境でテストコードによるテストの実行がしたい
  • カバレッジが確認したい
  • いずれはテスト駆動開発に移行したい

環境

  • Python 3.5.1
  • Django 1.10.5
  • caverage 4.3.4
  • django-nose 1.4.4

前提条件

  • Python,Djangoの環境はすでに構築済み
  • ログイン画面やログイン後の画面の実装は完了している

手順

coverageとdjango-noseのインストール

pipを使ってcoveragedjango-noseをインストールします。

$ pip install coverage
$ pip install django-nose

settings.py設定追加

下記の設定をsettings.pyに追加します。

# django-nose, coverage configure
INSTALLED_APPS += ('django_nose',)
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
NOSE_ARGS = [
    '--with-coverage',  # coverage を取る
    '--cover-html',  # coverage を html で cover/ に出力する
    '--cover-package=app_name1, app_name2',  # app_name1 と app_name2 を coverage を取得する対象アプリ名に書き換える
]

テストコードを書く

試しに画面にアクセスできるかどうかをテストするためのテストコードを書いてみます。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible
from django.test import TestCase
from accounts.models import AuthUser


@python_2_unicode_compatible
class AppName1ViewTests(TestCase):  #AppName1は自身の環境に併せて変更してください
    def setUp(self):
        """
        テスト実行前の処理
        ログイン可能なユーザを1名追加しておきます
        """
        AuthUser.objects.create_user(username='test',
                                     email='test@test.com',
                                     password='test',
                                     last_name=u'テスト',
                                     first_name=u'太郎')

    def test_index(self):
        """
        indexの画面へアクセスできるかどうかをテストする
        この画面はログインしているユーザ出ないとアクセスできません
        """
        client = self.client

        # まずはログインしていないユーザがアクセスした場合
        response = client.get('/')
        # ステータスコード:302が返却され画面にアクセスできない
        self.assertEqual(response.status_code, 302)

        # setUpで追加しておいたユーザでログインします
        client.login(username='test', password='test')

        # ログインしているユーザがアクセスした場合
        response = client.get('/')
        # ステータスコード:200が返却され画面にアクセスできている
        self.assertEqual(response.status_code, 200)

テストを実行する

djangomanage.pyを使って実際にテストを実行して見ます。

$ python manage.py test app_name1

app_name1は環境に併せたアプリケーション名に変更してください。

テストを実行すると・・・

nosetests dashboard --with-coverage --cover-html --cover-package=dashboard --verbosity=1
Creating test database for alias 'default'...
.
Name                  Stmts   Miss  Cover
-----------------------------------------
app_name1.py              0      0   100%
app_name1/admin.py        0      0   100%
app_name1/models.py       0      0   100%
app_name1/urls.py         4      0   100%
app_name1/views.py       10      0   100%
-----------------------------------------
TOTAL                    14      0   100%
----------------------------------------------------------------------
Ran 1 test in 0.604s

OK
Destroying test database for alias 'default'...

こんな感じでテストが実行されます。
テスト成功したので、テスト結果を確認します。

テスト結果を確認する

テストが終了するとcoverというディレクリが生成されます。
その中のindex.htmlというファイルをブラウザで開くと・・・

こんな感じでカバレッジを確認することができます。
さらに、views.pyをクリックすると・・・。

このように、どのコードをパスしているかも確認できます。

最後に

以上、Djangoでテストコードを書いてローカルで確認するまでの手順でした。
最近の開発では、テストコードを書くことが増えてきていると思いますので、よかったら参考にして見てください。
CI環境でのテスト自動化は、また今度、手順をまとめたいと思います!!