Djangoユニットテスト二三事
6727 ワード
ゼロ、はじめに
以前、微信公衆プラットフォームの開発者のバックグラウンドをやったことがありますが、機能は簡単で、私個人も怠け者なので、テストを書いていません.この間バージョンを更新して、コードを変更しました.その結果、昨日、バックグラウンドに問題が発生し、1つの機能が使用できないというメッセージが届きました.半日チェックしていたら、前回の更新時にその機能に関連したデータベースがうっかり削除されていたことに気づきました..機能が使用できなくなります.
今日誤りを修復した後、思い切ってテストを書くことにしました.これからこのような弱い問題が起こらないことを保証します.
一、どんなテストを使うか
Djangoのテストは、プロジェクト自体のデータベースに影響を与えるのではなく、新しいデータベースを作成し、テストが終了した後に削除します.だからプロジェクトデータの安全を心配しないでください.また、新しいデータベースなので、setupメソッドにデータを埋め込む必要があります.そうしないと、何もクエリーできませんよ.出力を見るとfixturesが提供されているようです.つまり、テスト用のデータをfixtureファイルに書き込んで、テスト開始時にこのファイルをデータベースにインポートすることができます.しかし、私のテストは小さいので、手動でデータを作成しました. はユーザのPOST要求をシミュレートし、デフォルトではCSRFをオフにし、オンにしたい場合はパラメータを追加することができる.
シミュレーション要求は、相対パス を使用する.は、本プロジェクトのみを要求することができ、他のサイトへのアクセスはできません.残念ですが...できればheadless browserとして を使えます試験の時runserverを使わないで、直接試験することができて、スピードを速める 三、私が出会った問題
以前、微信公衆プラットフォームの開発者のバックグラウンドをやったことがありますが、機能は簡単で、私個人も怠け者なので、テストを書いていません.この間バージョンを更新して、コードを変更しました.その結果、昨日、バックグラウンドに問題が発生し、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をテストし、顧客の要求をシミュレートし、返された結果を判断することができる.
いくつかの注意事項:
公式の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をテストし、顧客の要求をシミュレートし、返された結果を判断することができる.
いくつかの注意事項:
csrf_client = Client(enforce_csrf_checks=True)
三、私が出会った問題
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のテスト機能は悪くないが、特にユーザー要求をシミュレートするのは、かなり力がある.
私は長文が好きではありません.コピーや貼り付けも好きではありません.この文章は主にDjangoのテスト機能を紹介し、私が直面した問題を記録します.もし完全な紹介が必要なら、自分で公式サイトに行って見ることができます.それは私が書いたよりずっといいです.
総じてDjangoのテスト機能は悪くないが、特にユーザー要求をシミュレートするのは、かなり力がある.