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 | 設定値、pluginmanager 、plugin 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
を指定します。
この設定をしたあと、Pycharmからtest_calculation.py
を実行すれば、pytestのfixture(tmpdir
)が自動的に作成したディレクトリのパスが表示されます。
テストが終了したあとは、自動的にこのディレクトリを削除してくれます。
必要に応じて
テストのためのfixtureがたくさんあってその中の一つtmpdir
の簡単な使い方を紹介しました。
今日紹介したすべてのfixtureを一つずつ学習したとしても、実際に使うときには忘れている可能性があります。
効率を考えるのなら、おおざっぱにfixtureの使い方を理解した上で、必要に応じてそれぞれのfixtureの使い方を学習する方がいいと思います。
今回は、tmpdir
を使って一時ディレクトリを作成しそのパスを出力しましたが、明日はもう少し踏み込んだtmpdir
の使い方を学習します。
ちなみに、pythonのpytestにおけるfixtureは、テストの前後に行いたい処理ができるいわゆるsetup
とteardown
の進化版みたいなものでもあります。
しっかりと使い方を理解して、効率よくPythonのコードを書けるように頑張りましょう!
それでは、明日もGood Python!