なぜniltestを使うのか

仕様が実装・テスト・モック・Wikiに分散すると、変更のたびに同期が必要です。niltestは小さな振る舞いの例を実装の隣へ戻します。

  • 関数を開くだけで、代表的な入力と期待結果が分かる
  • 外部サービスがない開発環境でも、固定結果ですぐ動かせる
  • 同じケースで本物の実装を確認し、重複を減らせる

30秒で分かる基本形

@scenario を付け、if expect: 内にケースを書きます。通常のPython関数なので、実装はその下へ続けます。

python
import niltest
from niltest import Mode, expect, scenario

niltest.configure(mode=Mode.TEST)  # @scenarioより前

@scenario("配送料")
def shipping_fee(subtotal: int, premium: bool = False) -> int:
    if expect:
        expect.case(
            "プレミアム会員は無料",
            given={"subtotal": 1_000, "premium": True},
            returns=0,
        )

    return 0 if premium or subtotal >= 5_000 else 500

こんな場面に向いています

  • 外部APIやDBを使う関数の代表例を共有したい
  • 仕様とテストの食い違いを減らしたい
  • 乱数やIDを型・条件で柔軟に検証したい
  • 小さなPythonライブラリや業務ロジックを説明しやすくしたい