Djangoユニットテスト二三事

6727 ワード

ゼロ、はじめに
以前、微信公衆プラットフォームの開発者のバックグラウンドをやったことがありますが、機能は簡単で、私個人も怠け者なので、テストを書いていません.この間バージョンを更新して、コードを変更しました.その結果、昨日、バックグラウンドに問題が発生し、1つの機能が使用できないというメッセージが届きました.半日チェックしていたら、前回の更新時にその機能に関連したデータベースがうっかり削除されていたことに気づきました..機能が使用できなくなります.
今日誤りを修復した後、思い切ってテストを書くことにしました.これからこのような弱い問題が起こらないことを保証します.
 

一、どんなテストを使うか


私が使っているフレームワークはDjangoなので、最初の反応は公式サイトでドキュメントを調べることです.Django自身はテスト機能を持ち、Pythonのunittestをカプセル化し、他のテストフレームワークに接続するAPIを提供している.
簡単に紹介を見てみると、Djangoが持っている機能はもう十分で、他のフレームワークは必要ありません.
 

二、素早く手を打つ


公式の2つの小さな例を見てみましょう
1つ目:
 1 from django.test import TestCase

 2 from myapp.models import Animal

 3 

 4 class AnimalTestCase(TestCase):

 5     def setUp(self):

 6         Animal.objects.create(name="lion", sound="roar")

 7         Animal.objects.create(name="cat", sound="meow")

 8 

 9     def test_animals_can_speak(self):

10         """Animals that can speak are correctly identified"""

11         lion = Animal.objects.get(name="lion")

12         cat = Animal.objects.get(name="cat")

13         self.assertEqual(lion.speak(), 'The lion says "roar"')

14         self.assertEqual(cat.speak(), 'The cat says "meow"')

2つ目:
1 >>> from django.test import Client

2 >>> c = Client()

3 >>> response = c.post('/login/', {'username': 'john', 'password': 'smith'})

4 >>> response.status_code

5 200

6 >>> response = c.get('/customer/details/')

7 >>> response.content

8 '<!DOCTYPE html...'

OK、何かお堂が見えましたか?
実は私個人の感覚では、この2つの小さな例はDjangoテストの方法をはっきり説明するのに十分です.
最初の例は、モデルをテストし、モデルを作成して呼び出す方法です.
第2の例は、viewをテストし、顧客の要求をシミュレートし、返された結果を判断することができる.
 
いくつかの注意事項:
  • Djangoのテストは、プロジェクト自体のデータベースに影響を与えるのではなく、新しいデータベースを作成し、テストが終了した後に削除します.だからプロジェクトデータの安全を心配しないでください.また、新しいデータベースなので、setupメソッドにデータを埋め込む必要があります.そうしないと、何もクエリーできませんよ.出力を見るとfixturesが提供されているようです.つまり、テスト用のデータをfixtureファイルに書き込んで、テスト開始時にこのファイルをデータベースにインポートすることができます.しかし、私のテストは小さいので、手動でデータを作成しました.
  • はユーザのPOST要求をシミュレートし、デフォルトではCSRFをオフにし、オンにしたい場合はパラメータを追加することができる.
    csrf_client = Client(enforce_csrf_checks=True)

     
  • シミュレーション要求は、相対パス
  • を使用する.
  • は、本プロジェクトのみを要求することができ、他のサイトへのアクセスはできません.残念ですが...できればheadless browserとして
  • を使えます
  • 試験の時runserverを使わないで、直接試験することができて、スピードを速める
  • 三、私が出会った問題


    2つの問題にぶつかって、簡単に説明します.
    1つ目はファイルの命名問題で、公式にはtest*.py、testを作成しました.py、結局死んでも使えない.その後appのフォルダにtestsがあることに気づいた.py、テストコードをこれに入れれば使えます.
    二つ目は中国語の問題です.私のモデルには中国語のnameドメインが必要ですが、Vimでtestsを編集します.pyの場合、中国語を入力すると文字化けしてコピー&ペーストもできません.後で曲線救国の方法を思いついて、中国語が書けない以上、中国語対応のunicodeコードを書いて、文字列の前にuをつけてunicodeコードを強制的に使うことを考えて、やってみました.
    中国語対応のunicodeコードを取得するには、次のようにします.
    >>print repr(u'ははは')u'u 54 c 8u 54 c 8'
    これをtestsにコピーしますpyファイルでいいです.
     

    四、まとめ


    私は長文が好きではありません.コピーや貼り付けも好きではありません.この文章は主にDjangoのテスト機能を紹介し、私が直面した問題を記録します.もし完全な紹介が必要なら、自分で公式サイトに行って見ることができます.それは私が書いたよりずっといいです.
    総じてDjangoのテスト機能は悪くないが、特にユーザー要求をシミュレートするのは、かなり力がある.