pytestでsetup_method/teardown_methodを使って共通処理をまとめる

January 8th 2019

pytestで試験を書いていると共通の事前処理や事後処理が出てきたりすると思います。 その際の対処の方法について書いていきます。

環境

  • macOS 10.14
  • Python 3.6.4
  • Chrome 71.0.3578.98
  • pytest (4.0.2)
  • selenium (3.141.0)

手順

今回は以前の記事で紹介したselenium + pytestで使ったテストのコードをベースに説明を進めます。

[https://gist.github.com/8a66c730deca982d0d0cc6b0792666c7:embed#gist8a66c730deca982d0d0cc6b0792666c7]

ここに更に別のテストケースを追加するとしましょう。例えばGoogleトップページのロゴの画像のエレメントの存在を確認するテスト。

その場合、どうなるか。お察しの通り、以下の処理は重複することになります。

driver = webdriver.Chrome(executable_path=os.environ.get('CHROME_DRIVER_PATH')) driver.get('http://www.google.com') . . . driver.close()

そこでこれらをsetup_methodとteardown_methodという前処理用・後処理用のpytest fixtureを使って処理をまとめてしまいましょう。

[https://gist.github.com/5dface8d13149cb07c181c328a338bb6:embed#gist5dface8d13149cb07c181c328a338bb6]

テストを一塊にするために併せてTestGoogleというテストクラスも同時に定義しています。 そのクラスの中にそれぞれsetup_methodとteardown_methodを定義することで、それらの処理がこのテストクラス内において、それぞれのテスト(メソッド)毎に実施されることになります。

まとめ

setup_methodとteardown_methodについて勉強しました。これ以外にもmodule, class, function毎にsetup/teardownが用意されているので適宜利用するようにしてください。

[https://docs.pytest.org/en/latest/xunit_setup.html:title]

ただしpytestでは上記のプリセットなfixture以外に自分でfixtureを定義することが可能です。それにより柔軟な処理の追加を行うことができます。 次回はその方法についてまとめてみたいと思います。