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

Den*_*aia 15 python django unit-testing

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

有时我可能想要检查特定元素是否包含特定值,或者显示这些元素中有多少,或类似的东西.我怎么做这样的测试?

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

我知道我可以使用SeleniumPyccuracy(它使用Selenium),但由于启动浏览器的巨大开销,Selenium测试非常慢.此外,单元测试与django-coverage软件包一起开箱即用.

Ste*_*lim 9

我总是发现BeautifulSoup的组合,以及来自TestCase可用断言的 assertContains和assertFormError 来完成这个技巧.


Mar*_*ian 9

关于断言,这些其他答案现已过时.断言assertHTMLEqual(自Django 1.4开始)处理诸如忽略空格和忽略属性顺序之类的事情.


S.L*_*ott 6

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

此外,它有助于id="something"在HTML中使用标记,以便在单元测试时更容易找到内容.我们有这样的测试.

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' )
Run Code Online (Sandbox Code Playgroud)

很好地工作.

  • 我不想检查"包含",因为即使在空格更改时它也会破坏测试.另外,我不想写丑陋的不可读的regexp来匹配元素. (4认同)
  • 这个答案应该更新,因为`assertContains(html = True)`忽略无关的空格并忽略属性排序. (3认同)
  • 好的,你的观点是有道理的.但仍然......使用`contains`感觉不对,因为该元素可能有多个类或一些与测试本身无关的属性.这也意味着较小的设计/样式更改(如添加或更改类)可能会破坏测试,而不应该. (2认同)
  • 我在使用 assertContains 进行测试时遇到问题,正是因为空格 - 并且修改我的模板以避免空格是一个可怕的解决方法。 (2认同)