17

我还没有使用过 Django 和 Python 的内置测试功能,但我想最终开始......在整个开发过程中我想检查的最明显的事情之一是我的所有页面都验证在所有可能的情况下。

最好的方法是什么?

4

5 回答 5

7

好问题。我自己没有这样做,所以希望会有一些更好的答案,但您可能想查看 HTML 验证中间件:

“在所有可能的情况下”可能要求太多,具体取决于您的应用程序。例如,如果您创建了下一个 Facebook,因此每天都在接受大量的用户数据,那么某些时候就会出现破坏您网站上页面有效性的内容。

由于验证错误不会破坏功能,它可能是一种可接受的方法来检查一些有限的测试数据,然后在错误出现时做出反应。我相信这被称为愚蠢驱动测试

于 2010-06-21T17:06:38.763 回答
2

或者,在您通常的单元测试过程中验证您网站上的页面的自行滚动方法如下所示:

  1. 浏览您urls.py的网站并尽可能多地为该网站生成 URL
  2. 使用内置的 Django 测试客户端来获取这些 url
  3. 以某种方式验证它们(也许参见Validate (X)HTML in Python

不确定是否有人在这方面做过任何工作,这是一种可重用的方式。

于 2010-06-22T15:47:13.667 回答
2

一种解决方案是制作一个脚本,该脚本根据变量测试值的输入字典呈现所有模板。

检索模板中定义的变量列表的主要逻辑如下:

from django.template.loader import get_template

def extract_required_vars(node):
    if not hasattr(node, 'nodelist'):
        return []
    var_names = []
    for child_node in node.nodelist:
        if isinstance(child_node, VariableNode):
            var_names.append(child_node.filter_expression.token)
        elif isinstance(child_node, ForNode):
            var_names.append(child_node.sequence.var.var)
        elif isinstance(child_node, ExtendsNode):
            template = get_template(child_node.parent_name.var)
            var_names.extend(extract_required_vars(template))
        elif isinstance(child_node, IncludeNode):
            template = get_template(child_node.template.var)
            var_names.extend(extract_required_vars(template))
        var_names.extend(extract_required_vars(child_node))
    return var_names

required_vars = extract_required_vars(get_template('index.html'))

然后,该脚本会检查模板中定义的变量是否在项目设置中或在用户作为测试输入提供的字典中。

/path/to/project/templates/templates/allusers.html
  -> ok: users, STATIC_URL
/path/to/project/templates/entrer-en-contact.html
  -> ok: contactform, STATIC_URL
/path/to/project/templates/dest-summary.html
  -> ok: STATIC_URL
  -> missing: dest_username

此博客文章中的更多详细信息。

于 2015-04-19T13:42:11.617 回答
1

请参阅django-extensions项目,它有一个内置的模板验证器,可以使用如下管理命令运行:

python manage.py validate_templates

这只会尝试使用 django 的模板加载器加载您的模板,因此会检查是否缺少标签等内容。只要它可以创建一个模板对象,它就会通过。这是有关 get_template 的更多文档,这是它调用的方法。

于 2019-10-29T20:27:41.083 回答
0

Django Check HTML Middleware 可以检测 HTML 中的拼写错误:

https://github.com/guettli/django-check-html-middleware

于 2021-05-01T19:46:15.793 回答