開発プロセス中にDjangoテンプレートのHTMLをどのように検証すればよいですか?
-
28-09-2019 - |
質問
私はDjango'sとPythonの組み込みテスト機能をまだ使用していませんが、最終的に開始したいのですが、開発プロセス全体でチェックしたい最も明白なことの1つは、すべてのページが検証されていることです。すべての可能なシナリオで。
これを行うための最良の方法は何ですか?
解決
良い質問。私はこれを自分で行っていないので、うまくいけばいくつかのより良い答えがあるでしょうが、HTML検証ミドルウェアを調べたいかもしれません。
- http://djangosnippets.org/snippets/1312/
- http://lukeplant.me.uk/resources/djangovalidator/
- http://bstpierre.org/projects/htmlvalidatormiddleware/
「すべての可能なシナリオで」は、アプリに応じて要求するには多すぎるかもしれません。たとえば、次のFacebookを作成し、毎日膨大な量のユーザーデータを受け入れている場合、サイトのページの有効性を破るある時点で何かが入ります。
検証エラーは機能を破壊する傾向がないため、いくつかの限られたテストデータで確認してから、エラーが発生すると反応することは許容可能なアプローチかもしれません。これはとして知られていると思います 愚かなテスト.
他のヒント
あるいは、通常のユニットテストプロセス中にサイト上のページを検証するためのロールオードアプローチは、次のようになります。
- あなたを通り抜けます
urls.py
そして、あなたができるだけ多くのサイトに可能なURLを生成します - 使用する 組み込みのDjangoテストクライアント これらの各URLを取得します
- どういうわけかそれらを検証します(おそらく参照してください Pythonで(x)HTMLを検証します)
誰かがこれに関する作業のいずれかが再利用可能な方法かどうかはわかりません。
解決策の1つは、変数テスト値の入力辞書に基づいてすべてのテンプレートをレンダリングするスクリプトを作成することです。
テンプレートで定義されている変数のリストを取得する主なロジックは次のとおりです。
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'))
スクリプトは、テンプレートで定義されている変数がプロジェクト設定またはユーザーがテスト入力として提供するDICTのいずれかにあることを確認します。
/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
詳細 このブログ投稿で.
所属していません StackOverflow