2011-01-28 15 views
11

私は私のDjangoアプリケーションの単体テストを書いています。しかし、ビューのHTML出力をテストする方法はわかりません。DjangoビューのHTML出力を(unittestを使って)テストするには?

特定の要素に特定の値が含まれているか、表示されている要素の数やそのようなものがあるかどうかをチェックしたいことがあります。どうすればこのようなテストを行うことができますか?

unittestとdjango自身のdjango.testを使用するソリューションが欲しいです。

SeleniumまたはPyccuracy(これはSeleniumを使用しています)を使用できますが、ブラウザを起動するには膨大なオーバーヘッドがあるため、Seleniumテストは非常に遅いです。また、単体テストはdjango-coverageパッケージでそのまま使用できます。

答えて

8

これらの他の回答には、アサーションに関する時代遅れになりました。アサーションassertHTMLEqual(Django 1.4以降)は、空白を無視し、属性の順序を無視するようなことを処理します。

+0

この投稿のリンク404 – surfer190

+1

fixed –

8

私はいつもBeautifulSoupと、assertContainsとassertFormErrorの組み合わせがTestCase's available assertionsから見つかっています。

+1

またはBeautifulSoupの代わりに[lxml](http://lxml.de/)を使用してください。とにかく、3つの引数を受け取る 'assertElementContains'を書くのは簡単です:レスポンス本文、CSSセレクタ、そして文字列。 –

5

Djangoのテストフレームワークはこれに最適です。

  1. ステータスコードと内容を確認してください。 http://docs.djangoproject.com/en/1.2/topics/testing/#django.test.TestCase.assertContains

  2. テンプレートを確認してください。 http://docs.djangoproject.com/en/1.2/topics/testing/#django.test.TestCase.assertTemplateUsed

また、それが簡単にするとき、ユニットテストのものを見つけるために作るためにあなたのHTML内id="something"タグを使用することができます。このようなテストがあります。

def should_find_something(self): 
    response= self.client.get("/path/to/resource/pk/") 
    self.assertContains(response, '<td id="pk">the pk string</td>', status_code=200) 
    self.assertTemplateUsed(response, 'appropriate_page.html') 

うまく動作します。

+4

空白が変わってもテストが中断されるので、 "Contains"をチェックしたくありません。また、私は要素を一致させるために醜い読み取り不能な正規表現を書いたくありません。 –

+0

トリックは、テストされている部分の空白を避けることです。これは避けるのが非常に簡単です。例えば、コンテンツは、いくつかのエッジケースで役立ちます。 –

+0

いいえ、そうではありません。それはあなたがやろうとしていることに大きく依存します。時には、空白を避けることは容易ではない、あるいは不可能であることもあります。 –

関連する問題