2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
リンクをコピー
記事をブックマーク
横瀬明仁氏:それでは、Django管理サイトのカスタマイズで苦労するポイント4「コードが断片化しやすくテストがしづらい」という点についてです。
まずは、このadmin.pyのコードを見てみてください。ModelAdminを継承して、クラス変数をオーバーライドしたり、メソッドを追加したりしていますが、例えばこれをカバレッジ100パーセントにしても、もうまったく意味がないような気がしませんか?
このように、AdminSiteやModelAdminを継承したクラスは、断片的なコードしかないので、どのようなテストをすればよいかが悩みどころだと思います。最後のポイント4では、Django管理サイトの効率的なテストについて解説していきたいと思います。
解決策としては2つあります。どちらもパッケージを使って効率的なテストをしていくアプローチです。
まず1番目。lxmlを使ってテストをしていくパターンです。lxmlは、HTMLやXMLを解析するためのライブラリです。通常のViewのテストでは、テストクライアントとselfのclientを使って、レスポンスを取得してテストをすると思います。ただ、ステータスコードなどは検証できても、画面項目の細かな検証までは難しいと思います。
そこで、lxmlパッケージを使います。responseのrendered_contentという属性が、レンダリング後のHTML文字列になっています。それを使って、lxmlというライブラリでパースすれば、画面項目を検証が可能になります。
具体的なコードはあとで実際のコードを見てもらったほうがいいと思います。このテストコードでは、Bookモデルの一覧画面の検証をしているイメージです。setUpでテストレコードを作成して、まずtestメソッドの中でログインします。モデル一覧画面を表示するためのリクエストを実行して、レスポンスを受け取っています。
ChangeListPageがモデル一覧の画面部品をlxmlでパースして、HTMLエレメントオブジェクトを返してくれるように作った自作のクラスです。これのイニシャライザにresponseのrendered_contentを渡して、あとは要素をそれぞれチェックする流れになっています。TestCaseクラスをオーバーライドしているので、Djangoのtestコマンドで実行できるテストになっています。
これが先ほど説明したChangeListPageの実装ですが、イニシャライザでresponseのrendered_contentを受け取ってパースします。そして、それぞれのプロパティで画面のHTMLエレメントオブジェクトを返すような仕組みになっています。
ここでは、lxmlでパースして画面項目を検証することで、効率的で効果的なテストができるという雰囲気だけをつかんでもらえればOKだと思います。
それでは2番目、Seleniumのブラウザーテストのお話です。Seleniumは、プログラムからブラウザーを操作するためのツールです。実際にブラウザーにレンダリングされたHTMLを操作するので、よりユーザーに近いテストができます。
Seleniumには、ブラウザーのAPIを利用するためのWebDriverインターフェイスと、主要なブラウザー向けの実装クラスが含まれていますが、Chromeを利用する場合はChromeDriverが別途必要になります。
Pythonの場合は、Seleniumパッケージです。ChromeDriverを使う場合はchromedriver-binaryパッケージが利用できます。chromedriver-binaryパッケージは、ローカルやサーバーで使うChromeと、一応同じバージョンのパッケージをインストールしておくのが無難かなと思います。
次に、Django組み込みのTestCaseクラスについて説明します。(スライドを指して)Django組み込みのTestCaseクラスの継承関係を図示したものですが、これがDjangoのデータベースに関係するテストをする時によく使うTestCaseクラスです。これ以外にもSeleniumをテストする時には、StaticLiveServerTestCaseをよく利用します。
Django管理サイトの場合は、特にDjangoは組み込みでAdminSeleniumTestCaseがデフォルトで用意されています。setUpClassでは、WebDriverインスタンス、テストメソッドからはselfのseleniumでアクセスを作成して、さらにWebサーバーも起動してくれます。
(スライドを指して)実際のコードはこんな感じです。これがAdminSeleniumTestCaseを継承したテストコードの例です。クラスメソッドのcreate_webdriverをオーバーライドしているのは、ChromeDriverをインスタンス化して、ヘッドレスモードで立ち上げるような仕組みにするために、create_webdriverをオーバーライドしています。
その続きは、Bookモデルの一連のCRUD操作をするためのテストメソッドをイメージして作っています。まずadmin_loginは、親クラスのAdminSeleniumTestCaseに作られているメソッドです。ログインすると、self.selenium.save_screenshotがスクリーンショットを撮ってくれます。
これはキャプチャー画像が撮れるので、テスト後に目検でこの画像をチェックすることで、実際にCSSがどのように反映されているのかを、目測でもチェックできます。
モデル一覧画面でキャプチャーして、「本を追加」ボタンを押して、モデル追加画面をゴニョゴニョしたあと、最後に「保存」ボタンを押すという流れです。ずらっと一連の動きを実行しつつ、キャプチャーを撮っていくことができます。
ポイント4のまとめです。「コードが断片化しやすくテストがしづらい」という困りごとに対しては、生成されるHTMLをlxmlでパースして画面部品を検証する。そして状況に応じて、Seleniumのブラウザテストを追加することで対応します。このSeleniumのテストは実行時間が長くなりがちなので、対応には注意してください。
カスタマイズするにあたっての再度の苦労ポイントとして「日本語の情報が少ない」という問題があります。最近、Djangoの日本語書籍がどんどん増えてきて、特に2021年7月19日に芝田(将)さんが出した『実践Django』は、超期待の本です。とはいえ、まだまだDjango管理サイトについては情報が少ないのは確かです。なにかいい本がないだろうかと思っている方もいるかもしれません。
そこで、はい。ドン。『現場で使えるDjango管理サイトのつくり方』という本があります。実は私が書きました。Django管理サイトだけに特化した、ニッチでオンリーワンな、152ページの狂気じみた本です。
というわけで、Django管理サイトのまとまった日本語情報がない問題については、『現場で使えるDjango管理サイトのつくり方』を現場に1冊置きましょうということで完全に解決しました。
それでは全体のまとめです。このトークでは、Django管理サイトをカスタマイズするにあたって苦労するポイントと、その解決策を話しました。
そして、5つのポイント5つについては、それぞれ全体構造を把握しよう。テンプレートの修正には、テンプレートの優先順位と継承を使ってカスタマイズしよう。
画面のスタイルを変えるのが大変という問題については、CSSファイルを追加する仕組みを理解しよう。コードが断片化しやすくテストがしづらいという点については、lxmlやSeleniumを使っていきましょう。そして日本語情報については、すばらしい本があるのでぜひ読んでみましょうということで、このトークを終わりにしたいと思います。
ご清聴ありがとうございました。
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05