🐶
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
おわりに
ひとまず書いてみました。自己流で調べただけなので、もっとうまいやり方があると思いますが、記録まで。
参考
- ゼロから学ぶ Python:https://rinatz.github.io/python-book/ch08-02-pytest/
Discussion