序章

エラーなしで最初から完全に機能するWebサイトを構築することはほぼ不可能です。 そのため、Webアプリケーションをテストしてこれらのエラーを見つけ、プロアクティブに対処する必要があります。 テストの効率を向上させるために、テストをWebアプリケーションの特定の機能をテストするユニットに分割するのが一般的です。 この方法は、ユニットテストと呼ばれます。 テストはプロジェクトの小さな部分(ユニット)に他の部分から独立して焦点を当てているため、エラーの検出が容易になります。

Webサイトのテストは、HTTP要求の処理、フォームの検証、テンプレートのレンダリングなどのロジックの複数のレイヤーで構成されているため、実行するのが複雑なタスクになる可能性があります。 ただし、 Django は、Webアプリケーションのテストをシームレスにする一連のツールを提供します。 Djangoでは、テストを作成するための推奨される方法は、Python unittest モジュールを使用することですが、他のテストフレームワークを使用することもできます。

このチュートリアルでは、Djangoプロジェクトにテストスイートをセットアップし、アプリケーションのモデルとビューの単体テストを記述します。 これらのテストを実行し、その結果を分析して、テストの失敗の原因を見つける方法を学びます。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

ステップ1—Djangoアプリケーションにテストスイートを追加する

Djangoのテストスイートは、プロジェクト内のすべてのアプリのすべてのテストケースのコレクションです。 Djangoテストユーティリティが所有しているテストケースを検出できるようにするには、名前がで始まるスクリプトでテストケースを記述します。 test. このステップでは、テストスイートのディレクトリ構造とファイルを作成し、その中に空のテストケースを作成します。

Django Development チュートリアルシリーズに従った場合、Djangoアプリは次のようになります。 blogsite.

すべてのテストスクリプトを保持するフォルダを作成しましょう。 まず、仮想環境をアクティブ化します。

  1. cd ~/my_blog_app
  2. . env/bin/activate

次に、に移動します blogsite appディレクトリ、を含むフォルダ models.pyviews.py ファイルを作成し、という新しいフォルダを作成します tests:

  1. cd ~/my_blog_app/blog/blogsite
  2. mkdir tests

次に、このフォルダーをPythonパッケージに変換するので、 __init__.py ファイル:

  1. cd ~/my_blog_app/blog/blogsite/tests
  2. touch __init__.py

次に、モデルをテストするためのファイルと、ビューをテストするためのファイルを追加します。

  1. touch test_models.py
  2. touch test_views.py

最後に、で空のテストケースを作成します test_models.py. Django TestCaseクラスをインポートして、独自のテストケースクラスのスーパークラスにする必要があります。 後で、このテストケースにメソッドを追加して、モデルのロジックをテストします。 ファイルを開く test_models.py:

  1. nano test_models.py

次に、次のコードをファイルに追加します。

〜/ my_blog_app / blog / blogsite / tests / test_models.py
from django.test import TestCase

class ModelsTestCase(TestCase):
    pass

これで、テストスイートが正常に追加されました。 blogsite アプリ。 次に、ここで作成した空のモデルテストケースの詳細を入力します。

ステップ2—Pythonコードをテストする

このステップでは、で記述されたコードのロジックをテストします。 models.py ファイル。 特に、テストします save の方法 Post 呼び出されたときに投稿のタイトルの正しいスラッグを作成することを保証するモデル。

あなたがすでに持っているコードを見ることから始めましょう models.py のファイル save の方法 Post モデル:

  1. cd ~/my_blog_app/blog/blogsite
  2. nano models.py

次のように表示されます。

〜/ my_blog_app / blog / blogsite / 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:

  1. nano test_models.py

次に、それを次のように更新し、強調表示された部分を追加します。

〜/ my_blog_app / blog / blogsite / tests / 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 ファイル:

  1. nano test_views.py

次に、以下を追加します。

〜/ my_blog_app / blog / blogsite / tests / 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 ファイル):

  1. cd ~/my_blog_app/blog

次に、それらを次のように実行します。

  1. python manage.py test

端末に次のような出力が表示されます。

Output
Creating 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 失敗したテストをトリガーします。 まず、次のファイルを開きます。

  1. nano test_views.py

次に、強調表示されたコードを次のように変更します。

〜/ my_blog_app / blog / blogsite / tests / 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)

ここでは、ステータスコードをから変更しました 200404. 次に、ディレクトリからテストを再実行します。 manage.py:

  1. python manage.py test

次の出力が表示されます。

Output
Creating 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 ファイル:

〜/ my_blog_app / blog / blogsite / tests / 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.pyviews.py.

以下は、Djangoを使用してWebサイトを構築およびテストするときに役立つ可能性のあるいくつかの記事です。

その他のチュートリアルやプロジェクトについては、Djangoトピックページを確認することもできます。