如何使用unittest测试Django视图的HTML输出?

19 投票
5 回答
17387 浏览
提问于 2025-04-16 10:47

我正在为我的Django应用写单元测试。不过,我不知道怎么测试一个视图的HTML输出。

有时候我可能想检查某个特定的元素是否包含某个值,或者这些元素显示了多少个,或者类似的事情。我该怎么做这样的测试呢?

我希望能有一个使用unittest和Django自带的django.test的解决方案。

我知道可以使用Selenium或者Pyccuracy(它是基于Selenium的),但是Selenium的测试速度比较慢,因为启动浏览器的开销很大。而且,单元测试可以直接和django-coverage这个包一起使用。

5 个回答

9

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' )

效果很好。

14
12

这些其他的回答现在关于断言的内容已经过时了。断言 assertHTMLEqual(自Django 1.4起)可以处理一些事情,比如忽略空格和属性的顺序。

举个例子(来自文档):

from django.test import TestCase

class MyTest(TestCase):

    def test_some_html(self):
        # A passing test that doesn't raise an AssertionError.
        self.assertHTMLEqual(
            '<input type="checkbox" checked="checked" id="id_accept_terms" />',
            '<input id="id_accept_terms" type="checkbox" checked>'
        )

实际上,传给 assertHTMLEqual 的其中一个参数通常是动态生成的。

撰写回答