あえてDjangoで学んでみる自動テスト
Unagi.py 勉強会13枚目 2019.1.26
初めに環境設定
時間かかると思うので……。
- 何はともあれGit
- Pythonは3以降で。
Django公式FAQによると、最新が推奨とのこと。
当方は3.5.2です。
- (必須ではありませんが)Pipenv
入れておいていただくと、今回の環境設定が楽です。
- Djangoチュートリアルで開発するアプリ
用意したのでgit cloneしてみてください。
$ git clone https://github.com/chihiroyn/django-sample.git
ののち、必要なライブラリを入れます……といってもDjangoだけですが。
$ cd django-sample
$ pipenv install
$ pipenv shell
入れたら、Djangoが正しく入ったか確認してください。
$ python -m django --version
→ '2.1.5' ならOK!
自前でDjangoを入れている方は、2.1.5以降を推奨。
2.1.4以前は、404ページに偽装コンテンツを挿入可能になる脆弱性が報告されているとのこと。まあバージョン2以降であればたぶん支障無いと思います。
お前誰よ?(1)
- 名
-
諸々のコミュニティでは、「やなさん」で通しています。
- 趣味
-
ドライブ
(クルマは、所有欲を満たす存在としてではなく、
移動手段として好きです)
-
映画鑑賞(雑食系)
-
天体観測(最近、全然できてないけど)
-
子ども相手の野外活動
(野外炊飯、レクリエーション、小物のクラフト等)
-
読書(雑食系)
-
他もろもろ(やっぱり雑食系。興味が移ろいやすい)
### お前誰よ?(2)
- 本業
- 業務系システム(具体的には、生産管理・原価管理)
SE・プログラマ・時々マネージャもどき
- 過去業
- EC(いわゆるネット通販)モール・カートシステムの導入保守SE
Ruby on Rails・Yiiなど(しかし、コードはほとんど書いてませんでした)
- Python歴・おつきあい方
- 1年未満。
本業に生かすことをもくろんではいるが、道半ば。
まだまだ勉強中!
確かな事実として、
- テストコードを書くにも、保守するにも、
時間が必要 = コストが発生する。
→ すべてのテストを自動化することが、
必ずしも最善とは限らない!
(= テスト自動化は、いわゆる、
「銀の弾丸」では無い)
>>>
- しかし、(多くの)ソフトウェアは、
開発の期間よりも保守の期間の方が長い!
→ 長い目で見れば、テストの自動化は、
プロジェクトの品質面はもちろん、
コスト面にも寄与してくれることでしょう。
---
今日の題材を、いろいろ考えました。
- unittest
- Python標準
- その名の通り、
ユニットテスト(= 単体テスト)に特化しているっぽい。
>>>
- pytest
- テスト失敗時に詳細な情報を表示してくれるので、どこを直すべきかが分かりやすい、らしい。
- テスト準備(テストデータの用意とか)のためのコードが、かなり簡潔に記述できる、らしい。
らしい、でして……。
すみません、私がまだ使ったことがありません(^_^;)。
>>>
で、
- Django付属のテストツール
- ユニットテストに加え、Webサーバ起動せずにビューをテストする機能もある。
ファンクショナルテスト
(= 機能テスト)にあたる?
- Seleniumと連携してUIテストもできるらしい。
- カバレッジ(= テストケースの網羅率)
計測もできるらしい。
こういった、「オトクそうな響き」に弱い私は、
今回はこれを使うことにしました。\(^o^)/
---
### Djangoでの自動テストについて概要
Qiitaに素晴らしい記事があったので、拝借します。
- [Django] 自動テストについてのまとめ @okoppe8さん
- [https://qiita.com/okoppe8/items/eb7c3be5b9f6be244549](https://qiita.com/okoppe8/items/eb7c3be5b9f6be244549)
- 統合テストも可だが、JSの実行は不可。
- django-webtestというライブラリを使うことで、
CSSセレクタでもって、レスポンスのWebページから
特定DOMオブジェクトを取得し、リンクをたどる、
とかができるようになる、らしい。
---
### 教科書
#### Djangoのチュートリアルを使います
- はじめての Django アプリ作成
その 5 自動テストの導入
- [https://docs.djangoproject.com/ja/2.1/intro/tutorial05/](https://docs.djangoproject.com/ja/2.1/intro/tutorial05/)
### の前に……まず、Djangoの基本について
よくまとめていただいているblogがあったので、拝借します。
(ただし、Django1.11が題材のよう。
最新のDjango2.1.5とは少し、差があるかも)
damedeath様
- Django入門その後に(2)〜プロジェクトとアプリケーションを作ろう〜
- [http://farewell-work.hatenablog.com/entry/2017/05/07/160359](http://farewell-work.hatenablog.com/entry/2017/05/07/160359)
- (3)〜MTVモデルって何ですか? 難しいですか? 教えてもらって良いですか?〜
- [http://farewell-work.hatenablog.com/entry/2017/05/07/160503](http://farewell-work.hatenablog.com/entry/2017/05/07/160503)
### チュートリアルアプリを動かしてみる。
(このチュートリアルで、これからDjangoを学ぶ
予定の方には、「ネタバレ」になりますが、
ご容赦を……)
- プロジェクト「mysite」のルートディレクトリに移動する。
$ cd mysite/
- マイグレートを適用する。
$ python manage.py migrate
- いきなり起動してみる。
$ python manage.py runserver
>>>
- 投票ページを見てみる。
http://127.0.0.1:8000/polls/
- 投票するアンケート文を作るために、管理者サイトにアクセスしてみる。
http://127.0.0.1:8000/admin/
- 管理者ユーザーを作成する。
$ python manage.py createsuperuser
- ふたたび管理者サイトにアクセスして、ログインしてみる。
http://127.0.0.1:8000/admin/
- 投票するアンケート文を登録してみる。
- 投票の選択肢を登録してみる。
#### そしてチュートリアルの自動テストの章に挑む!
https://docs.djangoproject.com/ja/2.1/intro/tutorial05/
- ……の前に、私が書いていた「答え」をロールバックする。
$ git log
↓ このハッシュ値をコピってください。
commit 17cb44ad62f8a5467f21f3af9117e9c5b93f3479
(規制)
README.md を Bitbucket 上でオンラインで編集しました。
$ git reset --hard 17cb44ad62f8a5467f21f3af9117e9c5b93f3479
>>>
- Questionモデルのソースを見てみる。
- Questionモデルの
was_published_recently()メソッドに存在する
バグを確認する。
- https://docs.djangoproject.com/ja/2.1/intro/tutorial05/#we-identify-a-bug
>>>
- 以降は、チュートリアルに沿って進めます。
- 初めてのテスト作成
- バグをあぶり出すためにテストを作成する
- テストの実行
- バグを修正する
- より包括的なテスト(時間次第で割愛)
- ビューをテストする
- ビューに対するテスト
- Django テストクライアント
- ビューを改良する
- 新しいビューをテストする
- DetailView のテスト
- さらなるテストについて考える
---
## おつかれさまでしたっ!