🐕‍🦺

Djangoプロジェクトで設定しておくべきこと (5) ユニットテスト

2021/10/07に公開

前回の記事の続きです。

https://zenn.dev/masa0317/articles/e1e7ff5727ee21

今回はDjangoプロジェクトのユニットテスト(以下unit test)の仕組みについて説明していきます。

unit test

Djangoのunit testは

  • unittestを拡張したdjango.test.TestCase
  • pytestを拡張したpytest-django

のどちらかを利用します。

両者に大きな違いはないので、

自分の好みの方

を選択して問題ありません。

一般的には、

  • pytestに慣れているならpytest-django
  • Djangoの利用が初めてだったり、pytestを使ったことがない人はdjango.test.TestCase

を選択するのが良いと思います。

unit testツールのどちらを使うかという選択はたいして重要でなく、大切なのは

  • テストコードを強制的に書く仕組みが構築されている
  • テストコードが放置でなく管理されている
  • カバレッジを取って、カバレッジの低いコードはプロダクションコードに含めない

というルールの規定です。
そして、これらを仕組み化することです。

では、設定方法を説明していきます。

1-1. coverage

coverageはPythonプログラムのコードカバレッジを測定するツールです。

coverageをインストールすることで、コードカバレッジを測定し、テストコード不足を防げます。

ライブラリインストール後、setup.cfgに以下のように記載します。

[coverage:run]
branch = True
omit =
    */tests/*
    */migrations/*
    */__init__.py
    .venv/*

[coverage:report]
fail_under = 75
show_missing = True
skip_covered = True
omit =
    */tests/*
    */migrations/*
    */__init__.py
    .venv/*

fail_under = 75と設定しているのは、カバレッジが75%より低いとテスト失敗という意味です。

つまり、全てのテストコードの実行に成功しても、テストの網羅率が低いとエラーとして扱うということです。

カバレッジ率をいくつに設定するかについてはプロジェクトの種類や規模によって異なりますが、googleが85%目標なので、私は75%に設定しています。

一方で、成長軌道に乗ってないプロジェクトでは75%でも高すぎると思います。
60%で十分だと思います。

上記の設定は以下のコマンドで確認します。

coverage run manage.py test

実行できれば成功です。

DjangoのテストとVScodeの連携は公式で未対応のため、手間を省くためmakefiieに記載します。
保存のたびにテストを走らせる必要はないので、makefiieで十分です。

test:
        coverage run manage.py test
coverage:
        coverage report

と記載します。

これで

make test

とターミナルからコマンドを入力すればテストを実行できます。

coverageレポートも出力できるようにしておくと、カバレッジ率をあげるときに役立ちます。

これは

make coverage

で出力できます。

まとめ

今回はunit testの設定について説明しました。

今回の記事の内容まで実行すれば

  • [×] flake8で文法チェック
  • [×] isortでimportの並び順を統一
  • [×] radonでコードの質をチェック
  • [×] xeonでコードの質を担保できなければエラーにする
  • [×] mypyで型をチェック
  • [×] unit testでモジュール単位をテスト

まで仕組み化できたことになります。

次の記事ではE2Eテストの仕組み化について説明します。

Discussion