Help us understand the problem. What is going on with this article?

Pythonでpytestを試してみる(fixture)

More than 1 year has passed since last update.

前回の復習

Pythonでpytestを試してみる(conftest)では、conftest.py という python ファイルを作成し、
引数付きの pytest を実行できるようにした。

pytest ではこのようにテスト実行のために必要な準備や終了処理がフレームワークとして
組み込まれており、設定値として自由に受け渡しができる。
これを fixture と呼ぶ。

公式サイトを一読しておくと、いいかもしれない。

この fixture だが、プログラマが独自に設置することもできる。
今日は、独自 fixture について勉強しようと思う。

独自 fixture

まずは、conftest.py に独自 fixture を追加してみよう。

conftest.py
import pytest


@pytest.fixture
def csv_file():
    return 'csv file'


def pytest_addoption(parser):
    parser.addoption('--TEST-OS', default='Linux', help="テスト実行環境")

csv_file 関数が今回追加した独自 fixture だ。
また、import pytest で pytest をインポートし、独自 fixture にしたい
関数にデコレータ(@pytest.fixture)を追加するだけでいい。

テスト実行側で csv_file 関数が呼ばれたら 'csv_file' という文字列を
返すという単純なものだが、今回は動きを見たいだけなのでこれでいい。

あとは、テスト側で設定した fixture を受け取れるようにしよう。

keisan_test.py
import pytest
import keisan

do_test = True


class TestKeisan(object):

    @classmethod
    def setup_class(cls):
        print('TestKeisan - start')
        cls.cal = keisan.Keisan()

    @classmethod
    def teardown_class(cls):
        print('TestKeisan - end')
        del cls.cal

    def setup_method(self, method):
        print('method={}'.format(method.__name__))
        # self.cal = keisan.Keisan()

    def teardown_method(self, method):
        print('method={}:'.format(method.__name__))
        # del self.cal

    def test_value_error(self):
        with pytest.raises(ValueError):
            self.cal.add_number_plus_double("20", "10")

    # @pytest.mark.skip(reason='pytestskip')
    # @pytest.mark.skipif(do_test==False, reason='pytestskip')
    def test_add_number_plus_double(self, request):
        test_os = request.config.getoption('--TEST-OS')
        print(test_os)
        if test_os == 'Windows':
            print('Commit!')
        elif test_os == 'Mac':
            print('Cancel!')
        elif test_os == 'Linux':
            print('Nothing!')
        assert self.cal.add_number_plus_double(20, 10) == 60

    #独自 fixture 受け取り用の関数
    def test_add_number_plus_double_fixture(self, csv_file):
        print(csv_file)
        assert self.cal.add_number_plus_double(1, 1) == 4

新たに 「test_add_number_plus_double_fixture」 という関数を追加し、
引数で、csv_file fixture を受け取っている。

ちゃんと受け取られているのか確認するため、csv_file を print で出力している。

実行結果を見てみよう。

collected 3 items
keisan_test.py TestKeisan - start
method=test_value_error
.method=test_value_error:
method=test_add_number_plus_double
.Windows
Commit!
method=test_add_number_plus_double:
method=test_add_number_plus_double_fixture ★
.csv file ★
method=test_add_number_plus_double_fixture: ★
TestKeisan - end

★マークを付けた部分が今回追加した独自 fixture だ。
独自 fixture の受け渡しができていることがわかる。

このように簡単に fixture を作れるので、pytest の機能拡張も容易にできそうだ。
(使いこなせるかは、わからないけど)

色々と試してみて、使い道を模索していこうと思う。

まとめ

・独自 fixture を作るのは、意外に簡単だった。
・使いこなすためには、色々と試行錯誤が必要だと感じた。

__init__
PythonとGo言語が一番好きです。どちらも仕事で使っています!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away