関数の場合withを使わないようにするテスト対象がClassではなく関数を列挙した構成の場合。テスト対象がClassの場合あとがき参考リンクmock.patchでのテストでwithの多重入れ子になった場合に入れ子から如何に脱却するかを考えてみたPythonでmock.patchを使った時にwithの入れ子が酷くなった場合は、テストのやり方を見直してみようと思いました。プログラミング言語特集#pytest#Pythonhaoyayoi2021.02.24この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。はじめにPythonにてmock.patchを使ったテストケースを書いている時に、コンテキストをわかりやすくするためとはいえ以下のような状態に陥ることがあります。tutorial.setup()書いている時には気にならないのですが、PEP8の文字数指定79に引っかかることにより「酷いな」と気がつく有様です。withを止めるだけで解消できる状態かもしれません。いえ考えなしに変更するとテストが通らなくなってしまうことはよくあります。mock.patchの挙動を確認しつつ、PEP8やテストコードの意図を読み取り易くする対処方法について考えてみました。decoratorに移動させるテスト・開発・本番を環境変数にて切り分けている等、テスト内容に左右されず固定化させたい場合にはお薦めです。tutorial.setup()withを使わないようにするそれでもインデントが深いのは変わりません。上記ではreturn_valueが固定値のためdecorator化もできますが、大概は@pytest.mark.parametrizeを利用した、様々なケースをfixture化した上でパラメータとして渡す事が多いでしょう。そこでdecorator化及びwithも使わない方法にて進めます。テスト対象がClassではなく関数を列挙した構成の場合。tutorial.setup()ポイントは実行毎にimportしつつMockで書き換え適用しているところです。インデントも揃いました。mock_thing.setup()引数に指定するだけでMock挙動の追加が可能になります。念の為Mock自体の動作を確認しておく必要はあります。あとがきMockの動作はClassベースか関数のみで行っているかにより変わってくるでしょう。Classの利用は内部でセッション管理が必要か、Classを継承した実装のいずれかとなると思います。withを利用したコードはコンテキストを明確にしたい場合にはとても役に立ちます。withの入れ子が深くなった時はテスト設計の見直しも検討してみてください。