2012-10-19 14 views
12

テストをデバッグするにはどうすればよいですか?たとえば、POSTを使用してエントリを作成し、特定のページを検証して返すことを期待します。これはブラウザとシェルで動作しますが、テストだけが失敗する(皮肉にも!)。コンソールや何かにレスポンスを出力したいので、エラーや何があるのか​​を読むことができます。しかし、私はprintのようなものしか見ることができません。景色。Djangoで失敗したテストをデバッグするには?

わからないことが必要だが、ここtests.pyから問題のテストコードです:

resp = self.client.post('/meal/invite/', 
     {'summary': 'Test munch', 'when': now(), 'max_diners': '1', 'description': 'Munchies'}, follow=True) 
    self.assertEqual(resp.status_code, 200) 
    self.assertContains(resp, 'Test munch', 1) 
    self.assertContains(resp, 'You are hosting this meal', 1) 

最終主張が間違っています。元のフォームページに 'フィールド必須'エラーが表示されている値に変更した場合は、パスします。私は何が欠けているか分かりません。

私は他のいくつかのテストを行っていますが、これをデバッグする方法はわかりません。

どうやってですか?

答えて

8

pdbにドロップしてすべてを調べることができます。

あなたは私はあなたがこれをすぐに出力を見てからあなたを保つものです-s

-s, --nocapture  Don't capture stdout (any stdout output will be 
         printed immediately) [NOSE_NOCAPTURE] 

を使用してテストを実行する必要があると考えていnoseを使用している場合。

+0

はい、これは私にとって大きな助けとなりました。 ( 'import ipdb; ipdb.set_trace()')でブレークポイントを追加しても、私の './manage.py test'コマンドはブレークポイントで停止していませんでした。この '-s'フラグを加えることでこれが修正されます。 – modulitos

3

最も簡単なことは、アサーションの前にprint response.contentを追加することです。出力は少し圧倒されることがありますが、多くの場合、問題を特定するのに十分です。

解決できない場合は、ドキュメントに記載されている多数の機能が役立ちます。いくつかのprint文を追加して、あなたが得るものを見てください。ここにいくつかの提案がありますが、これらに限定されるものではありません。ドキュメントにはさらに多くのツールがあります。

https://docs.djangoproject.com/en/dev/topics/testing/

まず、あなたが期待するように、ページが実際にリダイレクトされていることを確認する必要があります。 redirect_chainまたはassertRedirectsを使用してください。

投稿データが何らかの理由で有効ではないと思われます。応答コンテキストからフォームを取得できます。 PDBの下でテストを実行するには

form = response.context['form'] 
print form.is_valid() 
print form.errors 
+1

応答内容は印刷できますが、Djangoテストの実行時にstdoutがリダイレクトされる場所がわからないため、表示できません。 – jameshfisher

9

python -m pdb manage.py test yourapp 

私はAlasdair、(一般的には、印刷のもの)プリントresponse.contentに同意は大きな助けです。出力は通常のテストランナーの出力と混ざってしまいます。問題を見つけて修正すると削除されますが、問題の絞り込みに役立ちます。

また、コードがブラウザとシェルで動作し、単体テストでは機能しない場合は、単体テストで新しい(空の)データベースが作成されることに注意してください。 setUpがテストに必要なデータを入力していることを確認します。

(Patrickの提案からのコード部分を更新しました。ありがとうPatrick)

+0

注:これは 'python -m pdb manage.py test yourapp'と読んでいるはずです。 – Patrick

関連する問題