目的
実際にやるのかやらないのかは別として、
Djangoのテンプレートのテスト方法について備忘として整理する。
前提
動作確認は以下の環境で行った。
- Ubuntu 18.04
- Python python 3.6.6
- Django 2.1.1
- requests-html 0.9.0
Djangoで利用しているのはテストとテンプレート部分のみなので
Djangoの1系列の割合新しいものであれば使えるはず。
手順
テスト対象のDjangoテンプレートは以下の通り。
(他のテンプレートからincludeする前提なのでpartialなHTML)
thread_list.html
<div class="list-group">
<div class="list-group-item active">スレッド一覧</div>
{% for comment in comments %}
<a href="#{{ comment.comment_id }}" class="list-group-item">
{{ comment.title }}
</a>
{% endfor %}
</ul>
テストコードは以下の通り。
test_thread_list.py
from django import test
from django.shortcuts import render
from requests_html import HTML
class TestThreadList(test.TestCase):
def test_render(self):
# テンプレートに投入するデータの準備
comments = []
for num in range(4):
comments.append({
'comment_id': num,
'title': 'title'+str(num),
})
response_param = {
'comments': comments,
}
# レンダリングする
rendered = render(None, 'thread_list.html', response_param)
# HTMLパーサを準備してパース
parser = HTML(html=rendered.content.decode())
## aタグのリストを取得
elements = parser.find('a')
for index in range(len(comments)):
element = elements[index]
## textアトリビュートかあらaタグの中身を取得して比較する。
self.assertEqual(element.text, "title"+str(index))
テストの実行
$ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.004s
OK
Destroying test database for alias 'default'...
注意
あくまでも期待した(partialな)HTMLが生成されているかを
確認しているだけなので、実際のブラウザ上での表示については別途テストが必要。
基本的に専門外のエンジニアの戯言のようなものなので話半分、参考程度の扱いにしておくこと。
雑感
テンプレートのテストを書くのか書かないのかは別として、書く場合のやり方として多少の意味は見いだせそう。
プラスで、大きなテンプレートを一枚いたで準備するのではなく、includeなとを適宜使いながら
細かく作っていくことに意義は見いだせるようになりそう。