このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】デバッグやテストに使うassert文

デバッグやテストに使うassert文

 assert文は、プログラム中のある条件が必ず成立していることを「断言」し、万が一その条件が偽であった場合にAssertionErrorを発生させることで、デバッグやテストに役立つ機能です。これにより、プログラマは想定通りの状態でプログラムが動作しているかを確認でき、意図しない動作を早期に発見することができます。ここでは、assert文の基本構文からその応用例まで、具体的なサンプルプログラムとともに解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.assert文の基本

1.1. assert文の構文と動作

assert文は、以下のように記述します。

assert 式
assert 式, メッセージ

 この文は、式がTrueであれば何も起こらず、Falseの場合はAssertionErrorを発生させます。メッセージを指定すると、エラー時にその内容が表示されます。

以下の表は、assert文の主要な特徴をまとめたものです。

項目説明
基本構文assert 式
メッセージ指定assert 式, "エラーメッセージ"
動作式がFalseならAssertionErrorを発生させ、Trueなら何も起こらない。

1.2. assert文の目的と利用シーン

assert文は、以下のような状況で有効です。

  • 前提条件の検証:関数の引数や内部状態が想定通りであることを確認する。
  • デバッグ:開発中に想定外の状態が発生した場合に、プログラムを停止させて問題を特定する。
  • テスト:プログラムの正しさを自動で検証する簡易テストとして利用する。

2.assert文の応用例

2.1. 簡単な例:割引価格計算関数

 ここでは、割引価格を計算する関数discount_priceを例に、assert文を用いて前提条件を検証する方法を示します。この関数は、元の価格と割引率を受け取り、割引後の価格を返します。ただし、価格は負にならず、割引率は0から100の範囲内であることをassert文で保証します。

def discount_price(price, discount):
    # 価格は非負で、割引率は0から100の間であることを断言
    assert price >= 0, "Price must be non-negative."
    assert 0 <= discount <= 100, "Discount must be between 0 and 100."
    # 割引後の価格を計算して返す
    return price * (100 - discount) / 100

# 正常な入力の場合
print("Discounted price:", discount_price(2000, 25))  # 2000円の25%割引 → 1500.0

# 想定外の入力例(割引率が不正)
print("Discounted price:", discount_price(2000, 150))

実行結果

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Cell In[1], line 12
      9 print("Discounted price:", discount_price(2000, 25))  # 2000円の25%割引 → 1500.0
     11 # 想定外の入力例(割引率が不正)
---> 12 print("Discounted price:", discount_price(2000, 150))

Cell In[1], line 4, in discount_price(price, discount)
      1 def discount_price(price, discount):
      2     # 価格は非負で、割引率は0から100の間であることを断言
      3     assert price >= 0, "Price must be non-negative."
----> 4     assert 0 <= discount <= 100, "Discount must be between 0 and 100."
      5     # 割引後の価格を計算して返す
      6     return price * (100 - discount) / 100

AssertionError: Discount must be between 0 and 100.

解説

  • 関数discount_priceは、引数priceとdiscountを受け取ります。
  • assert文により、priceが0以上であること、discountが0以上100以下であることを検証します。
  • 正常な場合は、割引後の価格を計算して返し、価格が1500.0円と表示されます。
  • 割引率が150の場合、assert文の条件がFalseとなり、AssertionErrorが発生して「Discount must be between 0 and 100.」というエラーメッセージが表示されます。

2.2. テストにおけるassert文の利用例:年齢検証関数

 次に、ある年齢が妥当な範囲(0~120)にあるかをチェックする関数is_valid_ageを定義し、assert文を使ってテストする例です。

def is_valid_age(age):
    # 年齢が0以上120以下であればTrueを返す
    return 0 <= age <= 120

# テストケース
assert is_valid_age(25), "25 is a valid age."
assert not is_valid_age(-5), "-5 should be invalid."
assert not is_valid_age(130), "130 should be invalid."
assert is_valid_age(120), "120 is a valid age."

print("All age tests passed.")

実行結果

All age tests passed.

解説

  • 関数is_valid_ageは、年齢が0以上120以下であればTrue、そうでなければFalseを返します。
  • assert文を用いて、期待する結果が得られるかをテストします。
  • もしテストケースでAssertionErrorが発生しなければ、"All age tests passed." と表示され、関数が正しく動作していることが確認できます。

まとめ

assert文は、プログラムの前提条件やデバッグ、テストにおいて非常に有用なツールです。

  • 基本構文は「assert 式, メッセージ」で、式がFalseの場合にAssertionErrorを発生させます。
  • 関数の内部で前提条件を検証するためや、テストプログラムとして期待する出力をチェックするために活用できます。

これにより、プログラムの想定外の動作を早期に発見し、修正するための重要な手がかりとなります。