Djangoでdoctestを使う

しむどん 2025-02-26

これまでPythonとDjangoを使ってシステムを開発してきた。それらを振り返ってみるとunittestはしっかり実装しているけれど、doctestはあまり書いていないプロジェクトが多かった。doctestはほとんど書かれないし、自主的に書いたとしてもテストの実装をunittestとdoctestで分散させたくないという理由から、あまり歓迎されなかった。これは納得できる部分もあるのだけれど、僕にとってはどうも消化不良で納得のできない部分もあった。そこで今回はPythonとDjangoのプロジェクトでdoctestを取り扱う方法について考えてみたい。

なお、ここで紹介する方法は一般的に使われる方法ではない。

pytest-djangoを使えばDjangoプロジェクトでもdoctestを実行できる

pytest-djangoは、Djangoプロジェクトでpytestを利用できるようにするプラグインである。これを使用することで、Djangoの設定やテスト環境を簡単に構築でき、さらにdoctestも統合して実行することが可能になる。具体的には、 pytest コマンドを実行する際に、doctestが自動的に検出されて実行されるため、テストの一貫性を保ちながら効率的にテストを行うことができる。

Djangoでdoctestを実行するためのスクリプトを作る

Djangoプロジェクトでdoctestを効率的に実行するためには、自動化スクリプトを作成することが有効である。以下にその例を示す。

import os
import django
import doctest
from django.conf import settings

def setup_django():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
    django.setup()

if __name__ == "__main__":
    setup_django()
    import myapp.models  # テスト対象のモジュールをインポート
    doctest.testmod(myapp.models)
doctest_runner.py

このスクリプトでは、Djangoの設定を初期化し、必要なモジュールをインポートしてからdoctestを実行している。これにより、Djangoの環境下でdoctestをスムーズに実行することができる。

ベストプラクティスとしては、スクリプト内でDjangoの設定を明確にし、必要なモジュールのみをインポートするようにすることで、テストの実行速度や信頼性を向上させることができる。

テキストエディタを拡張してdoctestをもっとインタラクティブに

開発環境を改善するために、テキストエディタを拡張してdoctestをよりインタラクティブに扱うことが可能である。例えば、以下のような方法が考えられる。

  • エディタプラグインの利用: VimやVSCodeなどのエディタには、doctestをサポートするプラグインが存在する。これらを導入することで、コードを書きながらリアルタイムでdoctestの結果を確認できる。
  • ショートカットキーの設定: テストの実行を簡単にするために、特定のショートカットキーを設定し、doctestを素早く実行できるようにする。
  • 自動リロードの設定: コードの変更を検知して自動的にテストを再実行する設定を行うことで、開発効率を向上させる。

具体的な設定例として、VSCodeでは`Python`拡張機能を利用し、タスクランナーを設定することで、doctestの実行を自動化することができる。

まとめ

本記事では、PythonとDjangoのプロジェクトにおいてdoctestを活用する方法について考察した。doctestはドキュメントとテストを一体化することで、コードの信頼性と可読性を向上させる強力なツールである。しかし、Djangoプロジェクトでは標準のunittest環境ではdoctestの活用が難しいため、`pytest-django`の導入や手動でのスクリプト作成といった工夫が必要になる。また、開発環境を拡張することで、doctestの利用をさらに効率的に行うことが可能である。今後もdoctestを活用したテスト手法を取り入れることで、より高品質なDjangoアプリケーションの開発を目指していきたい。