Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

pytestで考えるテストケース

背景

テストコードを書いてください

このときにどんなテストコードを書けばいいでしょうか?

具体例をベースにテストケースの考え方について、本記事では考えます。

テストの種類

テストには、

等があります。

ここでは、最も簡単な単体テストについて、取り上げます。

具体例

以下のような関数があります。

このテストケースは何が考えられるでしょうか?

def double_and_get_index(value: int) -> str:
    if not type(value) is int:
        raise Exception("Please Int Value")

    value *= 10
    if value >= 1000:
        return "A"
    elif value >= 100:
        return "B"
    elif value >= 10:
        return "C"

私なら以下のテストコードを書きます。

import pytest 

def test_double_and_get_index():
    # 正常系
    assert double_and_get_index(2) == "C"
    assert double_and_get_index(20) == "B"
    assert double_and_get_index(200) == "A"

    # 異常系
    assert double_and_get_index(-10) is None
    
    with pytest.raises(Exception) as e:
        double_and_get_index("A")
    assert str(e.value) == "Please Int Value"

    with pytest.raises(Exception) as e:
        double_and_get_index(0.1)
    assert str(e.value) == "Please Int Value"

    with pytest.raises(Exception) as e:
        double_and_get_index(None)
    assert str(e.value) == "Please Int Value"

    # 境界値テスト
    assert double_and_get_index(9) == "C"
    assert double_and_get_index(10) == "B"
    assert double_and_get_index(11) == "B"
    assert double_and_get_index(99) == "B"
    assert double_and_get_index(100) == "A"
    assert double_and_get_index(101) == "A"

単体テストのテストケースとしては、以下のことをよく考えます。

1. 正常系

意図通りの入力値が入ってきた場合、意図通りの結果がでるか?

2. 異常系

想定外の入力値が入ってきた場合、Validationができているか?

3.境界値条件系

条件分岐の前後で適切に変更できているか?

4. 条件分岐の網羅性

条件分岐のすべてで動作検証しているか?

私が、レビュワーだったら最低限このぐらいは書こうねと伝えます。

参考になれば。