【问题标题】:How to test (using unittest) the HTML output of a Django view?如何测试(使用 unittest)Django 视图的 HTML 输出?
【发布时间】:2011-01-28 16:17:23
【问题描述】:

我正在为我的 Django 应用程序编写单元测试。但是,我不知道如何测试视图的 HTML 输出。

有时我可能想检查一个特定元素是否包含某个值,或者显示了多少这些元素,或者类似的东西。我怎样才能做这样的测试?

我想要一个使用 unittest 和 django 自己的 django.test 的解决方案。

我知道我可以使用 SeleniumPyccuracy(它使用 Selenium),但是由于启动浏览器的巨大开销,Selenium 测试非常慢。此外,单元测试可以直接使用 django-coverage 包。

【问题讨论】:

    标签: python django unit-testing


    【解决方案1】:

    我总是从TestCase's available assertions 中找到BeautifulSoup 和assertContains 和assertFormError 的组合来解决问题。

    【讨论】:

    • 或者使用 lxml 代替 BeautifulSoup。无论如何,编写一个接收 3 个参数的assertElementContains 应该很容易:响应正文、CSS 选择器和字符串。
    【解决方案2】:

    这些关于断言的其他答案现在已经过时了。断言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 的参数之一将是动态生成的。

    【讨论】:

    • 这篇文章中的链接 404
    • 答案通常最好显示示例而不是链接,因为所述链接将来可能会损坏并显示与问题更相关的代码。在这种情况下,您将如何使用assertHTMLEqual 来验证 DOM 元素是否存在(并且不必比较整个 HTML 字符串)?
    • @Alechan 我认为这个答案不是您验证 DOM 元素是否存在的正确解决方案。您需要一些在内存中实际构建 DOM 的东西,例如 Beautiful Soup 或 lxml——例如,请参阅 Steve Jalim 的答案。
    【解决方案3】:

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

    效果很好。

    【讨论】:

    • 我不想检查“包含”,因为即使在空格更改时它也会破坏测试。另外,我不想编写难看的正则表达式来匹配元素。
    • 好的,你的观点是有道理的。但是仍然...使用contains 感觉不对,因为元素可能有多个类或一些与测试本身无关的属性。这也意味着较小的设计/样式更改(例如添加或更改类)可能会破坏测试,但它不应该。
    • 我在使用 assertContains 进行测试时遇到问题,正是因为空格 - 并且修改我的模板以避免空格是一种可怕的解决方法。
    • @fuzzyman:当空格很重要时,我会不断引入span id="..."&gt; 标签以将焦点缩小到确切相关的测试结果。当模板发生小的措辞更改或演示文稿更改时,我总是会发生这种情况。
    • 这个答案应该更新,因为assertContains(html=True) 会忽略无关的空格并忽略属性排序。
    【解决方案4】:

    看看 Django with asserts - 它使用 lxml。

    https://django-with-asserts.readthedocs.org/en/latest/

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 2015-10-24
      • 2018-09-12
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多