pytestの備忘録


概要

pytestの記事なんてたくさんありますが、好みのまとまりになっているものはなかったので、個人用備忘録。

基本

pytestの基本的な書き方としては以下の通りとします。「test_main.py」というファイル中に「test_test1」関数があったとして、これがテスト時に実行されるされます。この中には、1つのassertが含まれており、これがテスト時で確認すべきものになります。

test_main.py
def test_test1():
    value1 = "inu"
    value2 = "inu"
    assert value1 == value2

その後、以下のコマンドを打つと、結果が表示されます。この時、実行されるのは関数名の頭に「test_」があるものです。

> pytest ./test_main.py

複数のテストケースを実行(pytest.mark.parametrize)

先ほどの関数に、複数のテストケースを実行させる場合は、以下のように改造します。コマンドは先ほどと同じです。

test_main.py
import pytest

@pytest.mark.parametrize("value1,value2", [
    "inu", "inu",
    "inu", "dog",
    "dog", "cane",
])
def test_test1(value1, value2):
    assert value1 == value2

実行すると、テストケース1はOKですが、他がNGになると思います。

テスト時に前処理・後処理を実行(pytest.fixture)

テストに前処理・後処理を実行する際は、以下のように改造します。

test_main.py
import pytest

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

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


@pytest.mark.parametrize("value1,value2", [
    "inu", "inu",
    "inu", "dog",
    "dog", "cane",
])
@pytest.mark.usefixtures("fixture1,fixture2")
def test_test1(value1, value2):
    assert value1 == value2

これは以下のような記述もできます。

test_main.py
import pytest

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

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


@pytest.mark.parametrize("value1,value2", [
    "inu", "inu",
    "inu", "dog",
    "dog", "cane",
])
def test_test1(value1, value2, fixture1,fixture2):
    # この場合、fixture_value = fixture1.getValue()といったよう使用できる。
    # これはyieldで値を返していた場合、その値を戻り値として取得することが出来る。
    assert value1 == value2

おわりに

ひとまず書いてみました。自己流で調べただけなので、もっとうまいやり方があると思いますが、記録まで。

参考