NumPy の 'testing.assert_warns()' 関数のサンプルコード集


使い方

testing.assert_warns() 関数の基本的な使い方は次のとおりです。

import numpy as np
from numpy.testing import assert_warns

def my_function(x):
    # 警告を発生させるコード

    return x

with np.warnings.catch_warnings():
    # 警告を抑制
    assert_warns(UserWarning, my_function, 10)

このコードは、my_function 関数が実行されたときに UserWarning が 1 回発生することを確認します。

オプション

assert_warns() 関数は、警告メッセージと警告が発生する回数を指定するためのオプション引数を受け取ります。

  • count 引数: 期待される警告の発生回数を指定します。デフォルトは 1 です。
  • message 引数: 期待される警告メッセージを指定します。デフォルトは None で、すべての警告が一致します。

import numpy as np
from numpy.testing import assert_warns

def my_function(x):
    # 警告を発生させるコード

    return x

with np.warnings.catch_warnings():
    assert_warns(UserWarning, my_function, 10, message="特定のメッセージ", count=2)
  • 警告は、コードの潜在的な問題を示す可能性があります。警告を無視する前に、必ず警告の原因を調査してください。
  • testing.assert_warns() 関数は、テストコードでのみ使用してください。本番コードで使用しないでください。


例 1: 特定の警告メッセージを確認する

この例では、my_function 関数が実行されたときに UserWarning が 1 回発生し、そのメッセージが "特定のメッセージ" であることを確認します。

import numpy as np
from numpy.testing import assert_warns

def my_function(x):
    np.divide(x, 0)  # ZeroDivisionError を発生させ、UserWarning をトリガーします

with np.warnings.catch_warnings():
    assert_warns(UserWarning, my_function, 10, message="特定のメッセージ")

例 2: 警告の発生回数を検証する

この例では、my_function 関数が実行されたときに RuntimeWarning が 2 回発生することを確認します。

import numpy as np
from numpy.testing import assert_warns

def my_function(x):
    np.seterr(all='warn')  # すべての例外を警告として処理
    np.full(10, np.nan)  # RuntimeWarning を発生させます

with np.warnings.catch_warnings():
    assert_warns(RuntimeWarning, my_function, 10, count=2)

例 3: 複数の警告を検証する

この例では、my_function 関数が実行されたときに UserWarningRuntimeWarning が 1 回ずつ発生することを確認します。

import numpy as np
from numpy.testing import assert_warns

def my_function(x):
    np.divide(x, 0)  # ZeroDivisionError を発生させ、UserWarning をトリガーします
    np.full(10, np.nan)  # RuntimeWarning を発生させます

with np.warnings.catch_warnings():
    assert_warns([UserWarning, RuntimeWarning], my_function, 10, count=1)
  • テストコードを書く際は、テスト対象のコードが期待どおりに動作することを確認するために、さまざまな警告メッセージと発生回数を検証することが重要です。


代替方法

  • warnings.catch_warnings() コンテキストマネージャーと len(warnings.catch_warnings())

この方法は、testing.assert_warns() と同じ機能を提供しますが、より柔軟性と制御性があります。

import numpy as np
import warnings

def my_function(x):
    # 警告を発生させるコード

    return x

with warnings.catch_warnings() as w:
    my_function(x)

    # 警告の数を検証
    assert len(w) == 1

    # 警告メッセージを確認
    assert w[0].message == "特定のメッセージ"
  • カスタムアサーション関数

より複雑なテストシナリオの場合は、カスタムアサーション関数を作成することもできます。

import numpy as np

def assert_custom_warning(expected_warning, func, *args, **kwargs):
    with warnings.catch_warnings() as w:
        func(*args, **kwargs)

    # 警告の数を検証
    assert len(w) == 1

    # 警告の種類を確認
    assert isinstance(w[0], expected_warning)

    # 警告メッセージを確認
    assert w[0].message == "特定のメッセージ"

def my_function(x):
    # 警告を発生させるコード

    return x

assert_custom_warning(UserWarning, my_function, 10)
方法利点欠点
testing.assert_warns()シンプルで使いやすい柔軟性と制御性に欠ける
warnings.catch_warnings() + len(warnings.catch_warnings())より柔軟性と制御性がある少し冗長
カスタムアサーション関数複雑なテストシナリオに適している複雑で書きにくい