Django Logo

[Django] Django のプロジェクトでテストコードを実行する手順について

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

目的

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

環境

  • 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 環境でのテスト自動化は、また今度、手順をまとめたいと思います!!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です