pytestでTDD

Test Driven Development with pytest を拝読してのメモ書き。

unittestはクラスから書く必要があるが、pytestはfunctionで書き始めることができる。

TDDとは

  • 失敗するテストを書く
  • テストを通すコードを書く
  • 必要に応じてリファクタリング

Red-Green-Refactor サイクル。

なぜTDDを用いるか

テストを書くには入力と出力を知っている必要がある。TDDはコーディングを始める前にアプリのインターフェースについて考えることを強制する。強制する、というときつい感じですが、何が与えられて何を出力すれば良いかをシンプルに整理するきっかけになる感じ。

コードベースでの自信につながる。新たな変更がシステムを壊したとしても、容易に修復できる。

あらゆるバグをなくすことはできなくても、少なくすることは可能。バグ対応する際にテストを書けば安心につながる。

ドキュメンテーションとして使える。フィーチャーの入出力をテストで表現することで、そのコードのインターフェースがどのように使われるかを知ることができる。

コードカバレッジ

pytest-cov がポピュラー(らしい)。

コードカバレッジが高いというのは、バグがないということではなくて、想定されるあらゆるシナリオについてテストされているかどうか、という指標。

インテグレーションテスト

ユニットテストは個々のモジュールの振る舞いが期待通りに動作することの確認。一方、インテグレーションテストはモジュールを束ねて、期待通りに動作するかを確認する。

インテグレーションテストは個々のコンポーネントのテストが通るまで失敗(fail)する。インテグレーションが成功(pass)すれば、ユーザーの要求に合うように作られたと判断できる。

Prime Numbersの実装例

※省略

Inventoryの実装例

※省略

まとめ

ユニットテストは個々のモジュールが期待通りに振る舞うことを確保する。インテグレーションテストはモジュールの集合(いわばコンポーネント)が相互的に期待通りに動作することを確保する。

(実装例の中にあった)fixturesparameterized functions は要件に合わせて素早くテストケースを対応させることができる。