Djangoで作ったWebアプリをCI(継続的インテグレーション)するために、Python/Django向けの自動テストツールを調査したので、その結果をまとめたいと思います。
目次
Python向けテストツール一覧
「python 自動テスト」で検索をかけて、紹介されているツールを調べました。
詳細は補足 「python 自動テスト」の検索結果を参照ください。
テストツール | 内容/メモ |
---|---|
Python unittest | ・Pythonコードのテストを行う上で有用な機能が実装された一群のモジュール (Pythonをインストールした時点で利用可能になっている) ・APIは、JUnit/nUnit/CppUnitシリーズのいずれかを使用している人にとっては馴染み深いもの |
Selenium | ・Web系のテストで使えそう。unittestと合わせて使用。 |
Pytest | ・Pythonのテストフレームの中で公式ドキュメントがしっかりしているらしい。 ・WebAPIテストには強力なツールらしい。 ・コンパイル言語だとコンパイル時に検出される類いのバグがよく見つかります ・pytest は unittest と上位互換性がある。 ・unittest で書いたテストコードも pytest から実行できる (pytest流の書き方のほうが効率的みたいだが) |
nose | ・Pytestと並ぶサードパーティ製のライブラリ ・unittestを拡張してテストを容易にする ・xUnitと互換性のあるテスト出力、カバレッジレポート、テストの選択など、多数のプラグインを提供 |
pytest-flake8 | ・flake8(Pythonのコードチェックツール)を実行できる ・flake8はPythonの文法チェックツール ・pytestから呼び出すことができる |
Doctest | ・ドキュメンテーション文字列中のインタラクティブなPythonセッションのように見えるテキストを検索し、 それらのセッションを実行して、表示されているとおりに動作することを確認 ・あまり使われないみたい |
tox | ・テスト環境の管理を自動化し、複数のインタープリタ構成に対してテストするためのツール ・単純なini形式の構成ファイルを使用して、複雑な複数パラメータのテスト行列を構成できます |
Unittest2 | ・Python 2.7のunittestモジュールのバックポートであり、改良されたAPIと以前のバージョンの Pythonよりも優れたアサーションを備えている ・python2でしか動かない? |
mock | ・Python 3.3以降、これは 標準ライブラリ で利用可能 ・テスト中のシステムの一部をモックオブジェクトに置き換え、それらがどのように使用されたかを アサーションすることができます。 |
pytest-cov | ・テストカバレッジを計測する ・ptyest と coverage のインテグレーションを提供している |
coverage | ・テストカバレッジ率を測ることができる ・モジュールのカバレッジを測ったりhtmlファイルにしたりできる (自分でスクリプト書かないといけない。) |
nosetests | ・カバレッジを測ることができるみたい |
【所感】
- unittestとPytestを押すのが多い。
- Pytestはunittestの上位互換性を持っているようなので、Pytestを使うのがいいのではと思う。
- pytest-covとpytest-flake8で+αの試験もできそう。
Django向けテストツール一覧
「django 自動テスト」で検索をかけて、紹介されているツールを調べました。
詳細は補足 「django 自動テスト」の検索結果を参照ください。
テストツール | 内容/メモ |
---|---|
Djangoのunittest | ・Djangoに標準搭載された単体テストのモジュール ・Python標準のテストモジュールunittest機能を拡張したもの |
Coverage.py | ・カバレッジ(テストのコード網羅率)の計測 ・Djangoの公式で推奨 |
django.test.Client | ・Djangoに標準搭載された結合テストのモジュール ・Djangoアプリに対して仮想的なHTTPリクエストを送信し、レスポンスを受け取れる ・ただしJavaScriptの実行は不可 |
django-webtest | ・レスポンスのHTMLページを、スクレイピングで利用されているBeautiful Soupのオブジェクトとして 扱えるので、CSSセレクタやaタグのハイパーリンク先への遷移が簡単にできるようになります。 |
Selenium | ・Seleniumは自動でブラウザを操作するためのツール ・UIテストで使用できる ・Django公式にテストケースの記載あり ・ドライバを用意すれば、Chromeとしてアクセスとかブラウザ指定した動作もできるみたい |
doctest | ・関数やクラスの docstring (ドキュメンテーション文字列) に埋め込まれたテスト |
Twill | ・その他のブラウザ自動化フレームワーク |
【所感】
- Djangoの自動テストではDjangoが標準搭載している「unitest.case.TestCase」を使っているサイトが多い。
- カバレッジは「unitest.case.TestCase」に合わせて「Converage.py」を使うみたい
- Djangoに対して「nose」、「pytest」などのテストツールの適用はできそうだが、あまり参考サイトがなさそう。
- Djangoの勉強も兼ねているので、個人的にはまず「unitest.case.TestCase」+「Converage.py」を採用したい。
- UIテストには「Selenium」が使われている
補足
補足 「python 自動テスト」の検索結果
「python 自動テスト」と検索をかけたときに、参考にしたサイトを以下にまとめます。
PythonでSeleniumを使った自動テスト | Qiita
- 記載日/更新日:2017年12月14日に更新
- 記載テストツール:Selenium,unittest
- Selenium(Web系のテストができるみたい)+unittestでWebアクセステスト
- 記載日/更新日:2016年03月23日に更新
- 記載テストツール:pytest
- pytestを使ったテスト。カバレッジは上がらないが、最終的にWebAPIテストに適用したみたい
- Pythonでテストを行うときの注意事項が最後にまとまっている。
Python標準のunittestの使い方メモ | Qiita
- 記載日/更新日:2020年01月20日に更新
- 記載テストツール:unittest,coverage,nosetests,pytest-cov
- unittestの使い方が分かりやすい
- カバレッジは「coverage」や「nosetests」を使うこと
- Python 2.7.11であることに注意
Python: ユニットテストを書いてみよう | CUBE SUGAR CONTAINER
- 記載日/更新日:2019/6/18に執筆
- 記載テストツール:unittest,pytest,nose,pytest-flake8,pytest-cov
- unittestを使ったテスト⇒pytest使ったテスト⇒pytestと合わせて実行できるpytest-flake8,pytest-covについて記載
- 最後にpytestを使った時のディレクトリ構成が記載されている。
- 記載日/更新日:??? 本みたい
- 記載テストツール:unittest,Doctest,pytest,nose,tox,Unittest2,mock
補足 「django 自動テスト」の検索結果
「django 自動テスト」と検索をかけたときに、参考にしたサイトを以下にまとめます。
[Django] 自動テストについてのまとめ | Qiita
- 記載日/更新日:2018年09月13日に更新
- 記載テストツール:Djangoのunittest,Coverage.py,django.test.Client,django-webtest,Selenium
- 小規模のテストならmanage.py startapp実行時に作成されるtests.pyに記述します
- 本格的なプロジェクトではtestsをパッケージ化し、その下にtest_XXX.pyという名前でテストを分割するのが一般的です
- unittestの規約にのっとり、プロジェクト内のファイル名がtestで始まるファイルが自動テストの対象となります。
- Djangoの自動テストはPython標準のテストモジュールunittest機能を拡張したもの
- カバレッジ(テストのコード網羅率)の計測には「Coverage.py」を使います。
- 以前はdjango-nose、django-coverageといったパッケージが利用されましたが、現在は公式でも「Coverage.py」を推奨
- django.test.Clientを使うことでWebテストを実施できる
- ただしJavaScriptの実行は不可
- いろいろな制約がありあまり使い勝手がよくない
- 結合テストを行うなら、django-webtestが良い
- Seleniumを使ったUIテストも可能
はじめての Django アプリ作成、その 5(django公式ドキュメント)
- 記載日/更新日:2018年09月13日に更新
- 記載テストツール:Djangoのunittest,django.test.Client,Selenium,Coverage.py
- 公式のチュートリアル
- モデルの内部ロジックにはDjangoのunittest、ビューのテストはdjango.test.Client
- さらなるテストとして、 Selenium のような "in-browser" のフレームワークを使うこともできます
- アプリケーションのテストされていない部分を発見するには、コードカバレッジをチェックするのが良い
- 詳細は Integration with coverage.py を参照
【Django入門】自動化されたtestを使ってみよう | Samurai Blog
- 記載日/更新日:2019/5/26に更新,2017/8/13に執筆
- 記載テストツール:Djangoのunittest,Selenium
- unittestとSeleniumを使った簡単なテストコードが書かれている
Djangoのテストの書き方とCircleCIを活用した継続的インテグレーション | CodeZine
- 記載日/更新日:2018/08/03に執筆
- 記載テストツール:Djangoのunittest,django.test.Client
- 途中からは会員(登録は無料)しか見れない
- CodeZineは有用そうなので登録しておいてもいいかも
Djangoアプリケーションのテスト(Django v1.0 documentation)
- 記載日/更新日:??? (Django1.0についてのサイトなので古そう)
- 記載テストツール:doctest,Djangoのunittest,test client,Twill,Selenium
- doctest:関数やクラスの docstring (ドキュメンテーション文字列) に埋め込まれたテストで、例えば以下のように Python の対話インタプリタ セッションを模した方法で書かれています
- unittest は Java の JUnit に影響を受けている ので、他の言語で JUnit から派生したテストフレームワークを使ったことがあ るのなら、unittest はかなりしっくりくるはずです。
- Django は全てのテスト を DEBUG=False で動かします。
- テストクライアントは Twill や Selenium やその他のブラウザ自動化フレームワークを置き換えようとするものではありません。
- 正しいビューが呼び出され、ビューが正しいコンテキストデータを生成してい るかどうかは、 Django のテストクライアントを使って調べてください。
- Twill や Selenium は、 レンダリング済みの HTML や、 JavaScript の機能 のような Web ページの ビヘイビア のテストに使ってください。
- (clientは結合評価のイメージ、SeleniumはUIテストのイメージ)
Djangoのテストの書き方について勉強したのでまとめる | c-bata web
- 記載日/更新日:2014-12-12に執筆
- 記載テストツール:Djangoのunittest
- cms/tests/ディレクトリを作成して、その中にテストコードを格納していきます.
【Django】テストコードの書き方について学んでいく | sup?
- 記載日/更新日:2019年1月25日に執筆
- 記載テストツール:Djangoのunittest
- testsディレクトリ作成してる
関連情報
ConoHa上でDockerを導入したり、DjangoでWebアプリを立ち上げたりした内容を以下の記事でまとめました。こちらもよろしければご覧になってください。
広告
Djangoをやるなら以下の書籍がオススメです。
DjangoでWebアプリを開発するときの要点が分かりやすくまとめられています。
ConoHa VPS
は初期費用不要で月に数百円で利用できる仮想サーバのサービスです。以下のような方には非常にオススメのサービスとなっています!
- 勉強がてらLinuxの環境をちょっと触ってみたい
⇒管理者権限が実行可能なLinuxサーバ環境が構築可能です! - スモールスタートでサービスを提供して、うまくいったら規模をスケールアップしたい
⇒後からメモリサイズやCPU数などのスケールアップ/スケールダウン可能です! - AWSやGCPなどのクラウドサービスは高いので、もっと安くサーバ構築したい
⇒初期費用なし、月数百円(1時間単位も可)で利用可能です!
以上!
コメント