Как проверить HTML в шаблонах Django в процессе разработки?
Я еще не использовал встроенные возможности тестирования Django и Python, но я хочу, наконец, начать... И одна из самых очевидных вещей, которую я хотел бы держать под контролем в течение всего процесса разработки, это то, что все мои страницы проверяются во всех возможных сценариях.
Как лучше всего это сделать?
3 ответов
хороший вопрос. Я не делал этого сам, поэтому, надеюсь, будут некоторые лучшие ответы, но вы можете посмотреть в промежуточное ПО проверки HTML:
- http://djangosnippets.org/snippets/1312/
- http://lukeplant.me.uk/resources/djangovalidator/
- http://bstpierre.org/Projects/HtmlValidatorMiddleware/
"во всех возможных сценариях" может быть слишком много, чтобы просить, в зависимости от вашего приложения. Например, если вы делаете следующий Facebook, и таким образом принимаете огромное количество пользовательских данных каждый день, что-то придет в какой-то момент, что нарушает действительность страницы на вашем сайте.
поскольку ошибки проверки не разрушают функциональность, может быть приемлемым подходом для проверки с некоторыми ограниченными тестовыми данными, а затем реагировать на ошибки по мере их появления. Я считаю, что это известно как тестирование на глупость.
кроме того, собственный подход к проверке страниц на вашем сайте во время обычного процесса модульного тестирования будет выглядеть примерно так:
- идти через ваш
urls.py
и создать как можно больше URL-адресов для сайта, как вы можете - использовать встроенный тестовый клиент Django чтобы получить каждый из этих URL
- проверять их как-то (см. Возможно проверить (X)HTML в Python)
Не уверен, что кто-либо делал любую работу на это многоразовый способ.
одним из решений является создание скрипта, который отображает все шаблоны на основе входного словаря тестовых значений переменных.
основная логика для получения списка переменных, определенных в шаблоне следующим образом:
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
более подробная информация в этом блоге пост.