Djangoプロジェクトにユニットテストを追加する方法
序章
エラーなしで最初から完全に機能するWebサイトを構築することはほぼ不可能です。 そのため、Webアプリケーションをテストしてこれらのエラーを見つけ、プロアクティブに対処する必要があります。 テストの効率を向上させるために、テストをWebアプリケーションの特定の機能をテストするユニットに分割するのが一般的です。 この方法は、ユニットテストと呼ばれます。 テストはプロジェクトの小さな部分(ユニット)に他の部分から独立して焦点を当てているため、エラーの検出が容易になります。
Webサイトのテストは、HTTP要求の処理、フォームの検証、テンプレートのレンダリングなどのロジックの複数のレイヤーで構成されているため、実行するのが複雑なタスクになる可能性があります。 ただし、 Django は、Webアプリケーションのテストをシームレスにする一連のツールを提供します。 Djangoでは、テストを作成するための推奨される方法は、Python unittest モジュールを使用することですが、他のテストフレームワークを使用することもできます。
このチュートリアルでは、Djangoプロジェクトにテストスイートをセットアップし、アプリケーションのモデルとビューの単体テストを記述します。 これらのテストを実行し、その結果を分析して、テストの失敗の原因を見つける方法を学びます。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- プログラミング環境がセットアップされたサーバーにDjangoがインストールされています。 これを行うには、DjangoWebフレームワークのインストール方法とプログラミング環境のセットアップチュートリアルのいずれかに従うことができます。
- モデルとビューで作成されたDjangoプロジェクト。 このチュートリアルでは、 DjangoDevelopmentチュートリアルシリーズのプロジェクトに従いました。
ステップ1—Djangoアプリケーションにテストスイートを追加する
Djangoのテストスイートは、プロジェクト内のすべてのアプリのすべてのテストケースのコレクションです。 Djangoテストユーティリティが所有しているテストケースを検出できるようにするには、名前がで始まるスクリプトでテストケースを記述します。 test
. このステップでは、テストスイートのディレクトリ構造とファイルを作成し、その中に空のテストケースを作成します。
Django Development チュートリアルシリーズに従った場合、Djangoアプリは次のようになります。 blogsite
.
すべてのテストスクリプトを保持するフォルダを作成しましょう。 まず、仮想環境をアクティブ化します。
- cd ~/my_blog_app
- . env/bin/activate
次に、に移動します blogsite
appディレクトリ、を含むフォルダ models.py
と views.py
ファイルを作成し、という新しいフォルダを作成します tests
:
- cd ~/my_blog_app/blog/blogsite
- mkdir tests
次に、このフォルダーをPythonパッケージに変換するので、 __init__.py
ファイル:
- cd ~/my_blog_app/blog/blogsite/tests
- touch __init__.py
次に、モデルをテストするためのファイルと、ビューをテストするためのファイルを追加します。
- touch test_models.py
- touch test_views.py
最後に、で空のテストケースを作成します test_models.py
. Django TestCaseクラスをインポートして、独自のテストケースクラスのスーパークラスにする必要があります。 後で、このテストケースにメソッドを追加して、モデルのロジックをテストします。 ファイルを開く test_models.py
:
- nano test_models.py
次に、次のコードをファイルに追加します。
from django.test import TestCase
class ModelsTestCase(TestCase):
pass
これで、テストスイートが正常に追加されました。 blogsite
アプリ。 次に、ここで作成した空のモデルテストケースの詳細を入力します。
ステップ2—Pythonコードをテストする
このステップでは、で記述されたコードのロジックをテストします。 models.py
ファイル。 特に、テストします save
の方法 Post
呼び出されたときに投稿のタイトルの正しいスラッグを作成することを保証するモデル。
あなたがすでに持っているコードを見ることから始めましょう models.py
のファイル save
の方法 Post
モデル:
- cd ~/my_blog_app/blog/blogsite
- nano models.py
次のように表示されます。
class Post(models.Model):
...
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Post, self).save(*args, **kwargs)
...
保存しようとしている投稿にスラッグ値があるかどうかを確認し、ない場合は呼び出します slugify
そのためのスラッグ値を作成します。 これは、投稿を保存するときにスラッグが実際に作成されることを確認するためにテストする可能性のあるロジックのタイプです。
ファイルを閉じます。
これをテストするには、に戻ってください test_models.py
:
- nano test_models.py
次に、それを次のように更新し、強調表示された部分を追加します。
from django.test import TestCase
from django.template.defaultfilters import slugify
from blogsite.models import Post
class ModelsTestCase(TestCase):
def test_post_has_slug(self):
"""Posts are given slugs correctly when saving"""
post = Post.objects.create(title="My first post")
post.author = "John Doe"
post.save()
self.assertEqual(post.slug, slugify(post.title))
この新しい方法 test_post_has_slug
タイトルの新しい投稿を作成します "My first post"
次に、投稿に作成者を指定して、投稿を保存します。 この後、 assertEqual
Python unittest モジュールのメソッドで、投稿のスラッグが正しいかどうかをチェックします。 The assertEqual
メソッドは、渡された2つの引数が等しいかどうかをチェックします。 "=="
演算子であり、そうでない場合はエラーを発生させます。
保存して終了 test_models.py
.
これは、テストできるものの例です。 プロジェクトに追加するロジックが多いほど、テストする必要があります。 さらにロジックを追加する場合 save
メソッドまたは新しいメソッドを作成する Post
モデルの場合、ここにさらにテストを追加する必要があります。 あなたはそれらをに追加することができます test_post_has_slug
メソッドまたは新しいテストメソッドを作成しますが、それらの名前はで始まる必要があります test
.
これで、テストケースが正常に作成されました。 Post
保存後にスラッグが正しく作成されると主張したモデル。 次のステップでは、ビューをテストするためのテストケースを作成します。
ステップ3—Djangoのテストクライアントを使用する
このステップでは、Djangoテストクライアントを使用してビューをテストするテストケースを作成します。 テストクライアントは、ダミーのWebブラウザーとして機能するPythonクラスであり、ユーザーと同じようにビューをテストしてDjangoアプリケーションを操作できます。 を参照してテストクライアントにアクセスできます self.client
あなたのテスト方法で。 たとえば、でテストケースを作成しましょう test_views.py
. まず、 test_views.py
ファイル:
- nano test_views.py
次に、以下を追加します。
from django.test import TestCase
class ViewsTestCase(TestCase):
def test_index_loads_properly(self):
"""The index page loads properly"""
response = self.client.get('your_server_ip:8000')
self.assertEqual(response.status_code, 200)
The ViewsTestCase
が含まれています test_index_loads_properly
Djangoテストクライアントを使用してWebサイトのインデックスページにアクセスする方法(http://your_server_ip:8000
、 どこ your_server_ip
使用しているサーバーのIPアドレスです)。 次に、テストメソッドは応答のステータスコードが 200
、これは、ページがエラーなしで応答したことを意味します。 その結果、ユーザーがアクセスしたときにもエラーなしで応答することを確認できます。
ステータスコードとは別に、 Django Documentation TestingResponsesページでテストできるテストクライアントレスポンスの他のプロパティについて読むことができます。
このステップでは、インデックスページをレンダリングするビューがエラーなしで機能することをテストするためのテストケースを作成しました。 これで、テストスイートに2つのテストケースがあります。 次のステップでは、それらを実行して結果を確認します。
ステップ4—テストの実行
プロジェクトの一連のテストの作成が完了したので、次はこれらのテストを実行して結果を確認します。 テストを実行するには、に移動します blog
フォルダ(アプリケーションの manage.py
ファイル):
- cd ~/my_blog_app/blog
次に、それらを次のように実行します。
- python manage.py test
端末に次のような出力が表示されます。
OutputCreating test database for alias 'default'...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 0.007s
OK
Destroying test database for alias 'default'...
この出力には、2つのドットがあります ..
、それぞれが合格したテストケースを表します。 次に、変更します test_views.py
失敗したテストをトリガーします。 まず、次のファイルを開きます。
- nano test_views.py
次に、強調表示されたコードを次のように変更します。
from django.test import TestCase
class ViewsTestCase(TestCase):
def test_index_loads_properly(self):
"""The index page loads properly"""
response = self.client.get('your_server_ip:8000')
self.assertEqual(response.status_code, 404)
ここでは、ステータスコードをから変更しました 200
に 404
. 次に、ディレクトリからテストを再実行します。 manage.py
:
- python manage.py test
次の出力が表示されます。
OutputCreating test database for alias 'default'...
System check identified no issues (0 silenced).
.F
======================================================================
FAIL: test_index_loads_properly (blogsite.tests.test_views.ViewsTestCase)
The index page loads properly
----------------------------------------------------------------------
Traceback (most recent call last):
File "~/my_blog_app/blog/blogsite/tests/test_views.py", line 8, in test_index_loads_properly
self.assertEqual(response.status_code, 404)
AssertionError: 200 != 404
----------------------------------------------------------------------
Ran 2 tests in 0.007s
FAILED (failures=1)
Destroying test database for alias 'default'...
失敗したスクリプト、テストケース、およびメソッドを示す説明的な失敗メッセージがあることがわかります。 また、失敗の原因、ステータスコードが等しくないことも示します 404
この場合、メッセージ付き AssertionError: 200 != 404
. The AssertionError
ここでは、ハイライトされたコード行で発生します test_views.py
ファイル:
from django.test import TestCase
class ViewsTestCase(TestCase):
def test_index_loads_properly(self):
"""The index page loads properly"""
response = self.client.get('your_server_ip:8000')
self.assertEqual(response.status_code, 404)
アサーションがfalse、つまり応答ステータスコード(200
)は期待されたものではありません(404
). 失敗メッセージの前に、2つのドットがあることがわかります ..
今に変更されました .F
、これは、最初のテストケースは合格し、2番目のテストケースは合格しなかったことを示しています。
結論
このチュートリアルでは、Djangoプロジェクトでテストスイートを作成し、テストモデルとビューロジックにテストケースを追加し、テストの実行方法を学び、テスト出力を分析しました。 次のステップとして、Pythonコード用の新しいテストスクリプトを作成できます。 models.py
と views.py
.
以下は、Djangoを使用してWebサイトを構築およびテストするときに役立つ可能性のあるいくつかの記事です。
- Djangoユニットテストドキュメント
- ScalingDjangoチュートリアルシリーズ
その他のチュートリアルやプロジェクトについては、Djangoトピックページを確認することもできます。