Djangoユニットテスト

2868 ワード

本稿では,Djangoフレームワークに基づいて開発されたwebプログラムによるユニットテストについて紹介する.
djangoプログラムを使用するview関数のパラメータは一般的にrequest形式なので、ユニットテストはどのように行いますか?次の2つのセクションで説明します.
  • 実現原理
  • 簡単な例
  • 実装の原理


    テストについては、DjangoのライブラリファイルTestCase、Clientを使用できます.
    from django.test import TestCase, Client
    

    TestCaseクラス


    Djangoのユニットテストでは、pythonを使用したunittestモジュール、djangoを使用します.test.TestCaseはpythonのunittestに継承されています.TestCase. ディレクトリの下にある「test」で始まるすべてのファイルを次のコードで実行できます.
    python manage.py test
    

    ここのTestCaseクラスは、仮想的な実行環境を構築し、新しいデータベースを構築することに相当します(「test_」先頭)は、新しく確立されたデータベースに基づいてtestプログラムを実行します.また、各テスト・インスタンスには、新しいデータベースがあります.したがって、各テスト・インスタンスの開始には、データが必要な場合は、ライブラリの構築、挿入、ログインなどの操作を再開する必要があります.

    Clientクラス


    多くのview関数がrequestsを受信しているので、Webページのクリックをシミュレートする必要があります.ここでClientを用いてpost,getリクエストを送信する必要がある.
    from django.test import Client
    c = Client()
    # post , url, 
    response = c.post('/login/', {'username': 'john', 'password': 'smith'})
    print(response.content)
    c.get('/customers/details/', {'name': 'fred', 'age': 7})
    print(resp.content)
    

    シミュレーションpostリクエストとgetリクエストを簡単に実現しました.
    1.getリクエストのパラメータ({'name':'fred','age':7})はデフォルトで、2を書かなくてもよい.postのリクエストパラメータは必須です.エラーが発生します:django.http.request.RawPostDataExceptionこれはdjangoがpostを処理する方法と関係がある.詳細は以下を参照してください.https://github.com/encode/django-rest-framework/issues/2774
    もちろんClientに対していくつかの修正を行うこともできます.例えば、Web側の操作をシミュレートします.
    from django.test import Client
    c = Client(HTTP_USER_AGENT='Mozilla/5.0')
    

    Clientのクラスは、ユーザーのログインとログインをシミュレートすることもできます.
    from django.test import Client
    c = Client()
    c.login(username='fred', password='secret')
    c.logout()
    

    単純な例


    urlsを含む例を示します.py,test.py,views.py
    # urls.py
    from django.conf.urls import url
    from adminpage.views import *
    
    urlpatterns = [
        url(r'^login/?$', AdminLogin.as_view()),
    ]
    
    # test.py
    c = Client(HTTP_USER_AGENT='Mozilla/5.0')
    class AuthLoginGet(TestCase):
        def test_admin_login_get(self):
            # c = Client(HTTP_USER_AGENT='Mozilla/5.0')
            resp = c.get('/api/a/login')
            mess = json.loads(str(resp.content, encoding="utf-8"))
            self.assertEqual(mess['code'], 4)
            self.assertEqual(mess['msg'], '')
    
    # views.py
    #  
    class AdminLogin(APIView):
    
        def get(self):
            if self.request.user.is_authenticated():
                return
            else:
                raise LoginError('')
    

    参考資料


    1.https://docs.djangoproject.com/en/dev/topics/testing/tools/#the-test-client 2.https://www.jianshu.com/p/5533c866453a