修行の場

知人が言っていました。これは修行だと。

PyTestで使いやすそうなモックテストライブラリ

monkey patch fixture

pytestの標準モックライブラリです。

The monkeypatch fixture helps you to safely set/delete an attribute, dictionary item or environment variable or to modify sys.path for importing.

関数のみでなく、メソッドの置き換えにも使えます。 他のシステムに依存していて、他のシステムがなかったり、挙動を作るのが困難な場合には、モックテストがかなり便利です。

注意点は次のとおりです。

  • Mind that patching stdlib functions and some third-party libraries used by pytest might break pytest itself, therefore in those cases it is recommended to use MonkeyPatch.context() to limit the patching to the block you want tested:
  • Be advised that it is not recommended to patch builtin functions such as open, compile, etc., because it might break pytest’s internals.

確かにassertの処理が壊れる可能性は否めない。pytestの挙動がおかしくなる事故を防ぐためにはpytestが依存しているモジュールに目を通しておくといいと思います。読み方はsetuptoolsのドキュメントを。 予期せぬエラーが発生した場合は、contextを使ってモックの範囲を絞ればいいでしょう。

pytest-mock

python3の標準ライブラリであるunittest.mockを使っています。 pytestのfixtureに対応していて、自動的にモックの解除をしてくれるようです。 モックの種類は次のとおりです。

  • patch: 上のmonkeypatchのようなもの
  • spy: 関数・メソッドの機能を壊さずに呼び出し回数などのテストができる。
  • stub: 引数を気にしなくて良いもの

unittest.mock

色々とクラスがあります。 ドキュメント参照。