Pythonのpytestでテストの前処理後処理を追加してみる

はじめに

この記事では、「Pythonのpytestでテストの前処理後処理を追加する方法」について書いています。

私はこれまでpytestを使ったことはほぼなく、pytestの勉強をしていますが、pytestでテストの前や後に処理を入れるにはどう書けばいいのか分からず調査したのが記事を書いたきっかけでした。

自分に向けた備忘録の意味もありますが、「pytest使いたいけどよく知らない」な人の一助になれば嬉しいです。

前提(環境)

以下の環境で実験をしていきます。

fixtureについて

pytestには、テストの実行前後で行いたい処理を記述するためにfixtureという機能があり、これを使ってテストの前処理後処理を記述していきます。fixtureはこの他にパラメータやオブジェクトをテストに渡すこともできます。

記述としては@pytest.fixtureを関数に付与し、テスト関数の引数に関数名を指定することでテスト実行前後の処理を記述する準備ができます。

具体的な例を、実際に試してみた内容を元に見ていきます。

まず、適当なpythonファイル(名前は何でも良いですが、ここではtest_add.pyとしました)を作り、中に以下のコードを書きます。

import pytest

@pytest.fixture
def alpha():
    print("--- start ---")
    
    yield
    
    print("--- end ---")

def test_add1(alpha):
    print("in test_add_1")
    assert 3 == 1 + 2

def test_add2():
    print("in test_add_2")
    assert 4 == 1 + 3

上のコードでalpha関数がテスト実行前後の処理を記述している部分になります。今回の例ではただ文字列を出力するだけです。

yieldの前がテストの前処理、後がテストの後処理です。

yieldには戻り値を指定し、テスト関数内で使うことができます。なので例えば前処理でファイルやクラスのオブジェクトを作成し、それをテスト関数に渡すこともできます。(ここでは前処理後処理を実装する方法を簡単に示すことを目的としているので何も返さないようにしています)

test_add1関数の引数にalphaを指定しているのでこれはtest_add1のテストを実行する前後でalpha関数に書かれた処理が実行されます。逆にtest_add2は引数にalphaを指定していないのでテスト前後で何か処理は行われません。

では実際に出力を見てみましょう。pytest -s -qを行うと以下のような出力結果が得られます。

--- start ---
in test_add_1
.--- end ---
in test_add_2
.
2 passed in 0.01s

上で書いたように、alpha関数の処理(print文の出力)がtest_add1関数の前後に入っており、またtest_add2関数の前後には処理が入っていないことが分かるかと思います。

おわりに

Pythonのpytestでテストの前処理後処理を追加する方法」について解説しました。

この方法を知っておくと、「テストの前後で処理を入れたい」時などに役に立つかと思います。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

note.com