Python pytestでfixtureを使う

Python学習【365日チャレンジ!】182日目のマスターU(@Udemy11)です。

なんだか一気に夏真っ盛りになった感じで、朝から蒸し暑くなってきました。

7月は観測史上初の台風が発生しなかったようですが、8月はいくつの台風が発生するんでしょうか?

台風が来るたびにいろいろと外にあるものを片付けないといけないので、できれば台風は来てほしくないのですが、そうもいかないんでしょうね。

それでは、今日もPython学習をはじめましょう。

昨日の復習

昨日は、pytestでオプションを受け取るconftestを学習しました。

conftest.pyを作成して、pytestを実行すると、自動的にconftest.pyを読み込んでくれました。

昨日は、conftest.pyで取得したオプションの--os-nameで情報を取得して、取得した値に対応した返り値を返すコードを書きました。

昨日学習したのは、pytestのほんの一部ですが、ほんといろいろなテストができるみたいです。

conftestの基本については、昨日の記事を参考にしてください。

今日は、pytestでいろいろなコマンドを受け取ることができるfixtureを学習します。

fixtureとは

まず、fixtureという言葉自体を調べてみました。

テストフィクスチャーとは

テストを実行、成功させるために必要な状態や前提条件の集合を、フィクスチャと呼ぶ。これらはテストコンテキストとも呼ばれる。開発者はテストの実行前にテストに適した状態を整え、テスト実行後に元の状態を復元することが望ましい。

一言でいうと、テストに関係する要素ってことですかね。

また、pytestの公式サイトには、英語ですが、さらに詳しく書かれていて、昨日学習したときに出てきたrequestを含めて次のようなものがあります。

名前 説明
capfd テキストデータとして、ファイルに値を出力。
capfdbinary バイトデータとして、ファイルに値を出力。
caplog ロギングをコントロールして、ログにアクセス。
capsys テキストデータとして、sys.stdoutおよびsys.stderrへの出力。
capsysbinary バイトデータとして、sys.stdoutおよびsys.stderrへの出力。
cache pytestの実行全体の値を保存して取得。
doctest_namespace docstests名前空間に挿入されたdictを提供
monkeypatch クラス、関数、辞書、os.environ、およびその他のオブジェクトを一時的に変更。
pytestconfig 設定値、pluginmanagerplugin hooksへアクセス。
record_property テストにプロパティを追加。
record_testsuite_property テストsuiteにプロパティを追加。
recwarn テスト関数によって発行された警告を記録。
request 実行中のテスト関数に関する情報を提供。
testdir pytestプラグインの実行とテストに役立つ一時的なテストディレクトリを提供。
tmp_path 各テスト関数にユニークな一時ディレクトリにpathlib.Pathオブジェクトを提供。
tmp_path_factory セッションスコープの一時ディレクトリを作成し、pathlib.Pathオブジェクトを返す。
tmpdir 各テスト関数にユニークな一時ディレクトリにpy.path.localオブジェクトを提供。 tmp_pathに置き換えられます。
tmpdir_factory セッションスコープの一時ディレクトリを作成し、py.path.localオブジェクトを返します。 tmp_path_factoryに置き換えられます。

解説はいまいち読んでもわからないものがあります。

実際に活用してみないとどんなものかはわかりませんが、いろいろな値を取得してテストを実行できるということですね。

今日は、これらの値の中で、tmpdirを使った簡単なテストコードを書いてみます。

calculation.py

テストするメインファイルは、昨日と同じcalculation.pyを使います。

class Cal(object):
   def add_and_double(self, x, y):
       if type(x) is not int or type(y) is not int:
           raise ValueError
       result = x + y
       result *= 2
       return result

test_calculation.py

テストを実行するファイルは昨日のコードを少し変更します。

import calculation

class TestCal(object):

    def test_add_and_double(self, tmpdir):
        print(tmpdir)
        cal = calculation.Cal()
        assert cal.add_and_double(1, 3) == 8

引数にrequestではなくtmpdirを指定して、tmpdirを出力しています。

ちなみにtmpdirは、一時的なディレクトリを作成してそのパスを返します。

Pycharmから実行

ターミナルからテストファイルを実行してprint出力を表示するには-s
コマンドに付け加えました。

Pycharmからpytestを実行して、print出力を表示するには、【Edit Configrations】から【Additional Arguments】に-sを指定します。

Python pytestでfixtureを使う

この設定をしたあと、Pycharmからtest_calculation.pyを実行すれば、pytestのfixture(tmpdir)が自動的に作成したディレクトリのパスが表示されます。

Python pytestでfixtureを使う

テストが終了したあとは、自動的にこのディレクトリを削除してくれます。

必要に応じて

テストのためのfixtureがたくさんあってその中の一つtmpdirの簡単な使い方を紹介しました。

今日紹介したすべてのfixtureを一つずつ学習したとしても、実際に使うときには忘れている可能性があります。

効率を考えるのなら、おおざっぱにfixtureの使い方を理解した上で、必要に応じてそれぞれのfixtureの使い方を学習する方がいいと思います。

今回は、tmpdirを使って一時ディレクトリを作成しそのパスを出力しましたが、明日はもう少し踏み込んだtmpdirの使い方を学習します。

ちなみに、pythonのpytestにおけるfixtureは、テストの前後に行いたい処理ができるいわゆるsetupteardownの進化版みたいなものでもあります。

しっかりと使い方を理解して、効率よくPythonのコードを書けるように頑張りましょう!

それでは、明日もGood Python!