Django Ninjaテストコード実践

こんにちは。
グローバルウェイの清家です。

Django Ninjaでテストを書くための”実践向けガイド”を紹介します。
Django Ninjaでは、URLリゾルバやミドルウェアの層を介さず高速にAPIのみをテストできる専用のテストクライアントを提供しています。

※Django Ninjaでのテストコードの実装は、過去の記事で紹介しています。

[Django NinjaでAPI開発]

この記事は以下のターゲットを対象としています。

★5 Djangoの開発経験が3年以上。
★4 Djangoの開発経験が1年以上。
★3 Webサイト開発経験あり。これからDjangoを学習します。
★2 Python初級者。簡単なプログラムコードが書けます。
★1プログラミング未経験。

なぜDjango Ninja専用のテストクライアントを使うのか

  1. 処理経路
    Django NinjaのRouter/APIを直接呼び出す設計で、URLリゾルバやミドルウェアを介さないため、軽量で高速、APIロジックに集中してテストを行えます。
  2. ミドルウェア
    CSRFやミドルウェアの副作用に影響されません
    代わりに、リクエストヘッダーやクッキーはテストクライアントのインスタンス化する際やget、post関数の引数に直接指定することができます。
  3. レスポンス/データアクセス
    response.json()によるJSON形式のデータ取得に加え、response.data(Schemaでデシリアライズ)が利用可能で、型安全に近いアサーションが書けます。
  4. 非同期(async)ビューのテスト
    非同期用テストクライアント(TestAsyncClient)を提供します。

<DjangoとDjango NinjaのTestClientの比較>

項目Django テストクライアント django.test.ClientDjango Ninja テストクライアント ninja.testing.TestClient
目的Djangoアプリ全体の統合テストAPIロジックのユニットテスト
処理経路URLconfからミドルウェアを経由してテンプレートレンダリングURLリゾルバやミドルウェアを介さない
ミドルウェアミドルウェアに依存する挙動ミドルウェアをスキップする
レスポンス/データアクセスresponse.status_code response.contentなどに加えテンプレートやリダイレクトの検証が可能response.json() response.data
非同期(async)ビューのテスト非対応(独自カスタマイズが必要)TestAsyncClientを提供する

次項では、テストコードの使用方法について紹介します。

テストコードを動かしてみよう

過去の記事:[Django Ninjaを使ってみる]で紹介したコードを、テストします。

本サンプルでは、正常動作(HTTPステータス200)とMethod Not Allowed(HTTPステータス405)を作成します。

ミドルウェアを作成します。
本サンプルコードでは、リクエストログをコンソールに出力します。

テストコードを実行します。
ミドルウェアをスキップして、APIのみがテストされていることがわかります。

アプリ全体の振る舞いまで含めて検証したい

URLリゾルバやミドルウェアなどアプリ全体の振る舞いまで含めて動作検証したい場合、Django標準のTestClientを利用します。

テストコードを実行します。
ミドルウェアによるログ出力が確認できます。

まとめ

Django Ninjaによるテストクライアントを使ったテストを紹介しました。

もし「ミドルウェアの動作も含めてNinja APIを検証したい」ケースがあれば、テストの目的に応じて両テストクライアントを使い分けるのがおすすめです。

なお、こうした話題も含め松山市で定期的にPythonセミナー等の活動を行っております。ご関心いただければ幸います。

参考文献

Testing tools | Django documentation | Django

The web framework for perfectionists with deadlines.