PyCon JP 2024

Your locale preferences have been saved. We like to think that we have excellent support for English in pretalx, but if you encounter issues or errors, please contact us!

あなたのアプリケーションをレガシーコードにしないための実践Pytest入門
2024-09-27 , 20F Track1

名著「レガシーコード改善ガイド」では、「テストがないコードはレガシーコード」と言われています。テストが無い(もしくは手動テストが大半を占める)アプリケーションは改修を重ねるたびにリリースが長期化し、いずれメンテナンス不可能なレガシーコードと成り果ててしまいます。

どのような分野・規模のアプリケーションであっても、テストは不可欠です。更に、アプリケーションを構築・改修して素早くリリースするためには、「高速かつ何度でもテストを実行できる仕組み」が非常に重要となってきます。

本セッションでは、Pythonの代表的なテストフレームワークであるpytestを用いた実践的なテスト方法を紹介します。シンプルなテストケースだけでなく、DBやネットワーク、ファイル入出力、時刻、OS情報など、複雑な依存関係にあるコードのテスト方法を解説していきます。また、テスト駆動開発(TDD)に基づくテストファーストな開発手法にも触れていきます。


本セッションでは、様々なPythonコードをpytestで自動テストする手法を解説していきます。

  • 昨年のPyConAPAC2023での先行発表「好きとか嫌いとかはいい、練習してテストを書けるようになるんだ」を更に発展させ、より複雑なコードをどのようにテストするかに焦点を当てて解説していきます。
  • コードが複雑なままだと、テストも必然的に複雑になります。本セッションでは単なる「pytestの使い方」の解説で終わらず、「テストを容易にするためのコードリファクタリング」も紹介し、テストを通じてコード品質を高める手法についても触れていきます。

タイムテーブルは以下で進める予定です。

  1. 導入(5min)
    - 自己紹介
    - なぜテストが必要なのか?
    - なぜ単体テストの自動化を重視するのか?
    - テスト駆動開発(TDD)の紹介
  2. pytest概説(5min)
    - AAAを意識したテストケースの書き方
    - fixtureによる前処理・後処理の実装
    - parametarizeによるパラメータテスト
    - tmp_pathによる一時ディレクトリの作成
    - pytest-covによるテストカバレッジの取得
  3. 様々なテストパターンとリファクタリング(18min)
    - DBに依存するコード
    - HTTPリクエストするコード
    - ファイル入出力を行うコード
    - 特定の日時で動作するコード
    - OS情報に依存するコード
  4. まとめ(2min)

Why did you choose this topic?

テストケースの作成に苦手意識を持つ方は多いと思います。私もPythonを学び始めた当初はケース作成に負担ばかり感じてなかなか馴染めず、長年テストに対して苦手意識を持っていました。

しかし、従来の手動テストをpytestで自動化したり、テストとリファクタリングを繰り返すことでコード品質を安定的に向上できるようになってから、徐々に「テストは楽しい」と感じられるようになりました。現在は複数プロジェクトにてテスト自動化を推進しています。

本セッションの聴講者にも、テストの手法や重要性だけでなく、「テストすることの楽しさ」を共有したいと思い、本題材を選びました。

Knowledges and know-how the audience can get from your talk
  • 自動実行可能なテストケースを作成することの重要性
  • pytestを活用して、シンプルなコードだけでなく、複雑な依存関係にあるコードをテストする方法
  • テスト駆動開発(TDD)の思想とその実践方法
Prior knowledges speakers assume the audience to have

特にありません。

Audience experiment

Beginner

Language of presentation

日本語

Language of presentation material

日本語

みずほリサーチ&テクノロジーズ株式会社 先端技術研究部に所属

アカウント
- Qiita: https://qiita.com/fujine
- SpeakerDeck: https://speakerdeck.com/mhrtech

過去の PyCon JP 発表経験
- PyConJP 2021: scikit-learnの新機能を紹介します
- PyConJP 2022: Pandas卒業?大規模データを様々なパッケージで高速処理してみる