Main Content

verifyError

クラス: matlab.unittest.qualifications.Verifiable
パッケージ: matlab.unittest.qualifications

関数が指定された例外をスローしたことを検証する

説明

verifyError(testCase,actual,identifier) は、actualidentifier で指定される例外をスローする関数ハンドルであることを検証します。

verifyError(testCase,actual,identifier,diagnostic) は、さらに diagnostic の診断情報を検定に関連付けます。

[output1,...,outputN] = verifyError(___) は、関数ハンドルによって生成された出力値も返します。この構文を使用して、関数ハンドルが呼び出されたときに要求する出力の数を制御します。関数ハンドルが例外をスローした場合、出力はすべて <missing> として表示されます。前述の構文にある任意の入力引数を組み合わせて使用できます。

入力引数

すべて展開する

テスト ケース。matlab.unittest.qualifications.Verifiable オブジェクトとして指定します。matlab.unittest.TestCase クラスは matlab.unittest.qualifications.Verifiable をサブクラス化してそのメソッドを継承するため、testCase は通常 matlab.unittest.TestCase オブジェクトです。

テストする値。任意のデータ型の値として指定します。任意のデータ型の値を指定できますが、actual が関数ハンドルではない場合、テストは失敗します。

例: @() myFunction(1,2)

例: @() rmdir("myFolder")

エラー識別子。string スカラー、文字ベクトル、または meta.class インスタンスとして指定します。

identifiermeta.class インスタンスである場合、スローされた例外は指定されたクラスのインスタンスであるか、またはそのサブクラスのいずれかである必要があります。

例: "MATLAB:UndefinedFunction"

例: ?MException

検定にパスしたときか失敗したときに表示する診断情報。string 配列、文字配列、関数ハンドル、または matlab.unittest.diagnostics.Diagnostic オブジェクトの配列として指定します。

テスト ランナーの構成に応じて、テスト フレームワークは検定にパスしたときまたは失敗したときに診断を表示できます。既定では、フレームワークは検定に失敗したときにのみ診断を表示します。この既定の動作はテスト ランナーをカスタマイズしてオーバーライドできます。たとえば、失敗したイベントとパスしたイベントの両方の診断を表示するには、DiagnosticsOutputPlugin インスタンスを使用します。

例: "My Custom Diagnostic"

例: @dir

属性

Sealedtrue

メソッドの属性の詳細については、メソッドの属性を参照してください。

すべて展開する

verifyError を使用して、無効な入力に関数が適切に動作するかどうかをテストします。

現在のフォルダー内のファイルに、関数 add5 を作成します。この関数は、数値入力を受け入れて 5 だけインクリメントします。非数値入力で呼び出されると、関数は "add5:InputMustBeNumeric" で指定された例外をスローします。

function y = add5(x)
% add5 - Increment input by 5
if ~isa(x,"numeric")
    error("add5:InputMustBeNumeric","Input must be numeric.")
end
y = x + 5;
end

対話型テスト用にテスト ケースを作成して、add5 が入力 '0' で呼び出された場合に、指定された例外をスローすることを検証します。

testCase = matlab.unittest.TestCase.forInteractiveUse;
verifyError(testCase,@() add5('0'),"add5:InputMustBeNumeric")
Verification passed.

実際の値が、指定された例外をスローする関数ハンドルであるかどうかをテストします。

対話型テスト用にテスト ケースを作成します。

testCase = matlab.unittest.TestCase.forInteractiveUse;

関数 error が、期待される識別子の例外をスローすることを検証します。

verifyError(testCase,@() error("SOME:error:id","Error!"),"SOME:error:id")
Verification passed.

"OTHER:error:id" を期待されるエラー識別子に指定し、テストを繰り返します。テストは失敗します。

verifyError(testCase,@() error("SOME:error:id","Error!"), ...
    "OTHER:error:id","Error identifiers must match.")
Verification failed.
    ----------------
    Test Diagnostic:
    ----------------
    Error identifiers must match.
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyError failed.
    --> The function threw the wrong exception.
        
        Actual Exception:
            'SOME:error:id'
        Expected Exception:
            'OTHER:error:id'
    --> Actual Error Report:
            Error using
            VerifyErrorTestForSpecifiedExceptionsExample>@()error("SOME:error:id","Error!")
            (line 20)
            Error!
    
    Evaluated Function:
      function_handle with value:
    
        @()error("SOME:error:id","Error!")
    ------------------
    Stack Information:
    ------------------
    In C:\work\TestForSpecifiedExceptionsExample.m (TestForSpecifiedExceptionsExample) at 20

関数 rand をテストして、関数の出力も調べます。rand は例外をスローしないため、テストは失敗します。

r = verifyError(testCase,@rand,?MException)
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyError failed.
    --> The function did not throw any exception.
        
        Expected Exception:
            ?MException
    
    Evaluated Function:
      function_handle with value:
    
        @rand
    ------------------
    Stack Information:
    ------------------
    In C:\work\TestForSpecifiedExceptionsExample.m (TestForSpecifiedExceptionsExample) at 26

r =

    0.8147

実際の値が関数ハンドルでない場合、テストが失敗することを検証します。

verifyError(testCase,5,?MException)
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyError failed.
    --> The value must be an instance of the expected type.
        
        Actual Class:
            double
        Expected Type:
            function_handle
    
    Actual Value:
         5
    ------------------
    Stack Information:
    ------------------
    In C:\work\TestForSpecifiedExceptionsExample.m (TestForSpecifiedExceptionsExample) at 30

呼び出し時の出力の数が多すぎる場合、関数が指定された例外をスローすることを検証します。

現在のフォルダー内のファイルに、可変個の入出力を受け入れる関数 variableNumArguments を作成します。出力の数が入力の数より大きい場合、関数は例外をスローします。それ以外の場合、入力のクラスを返します。

function varargout = variableNumArguments(varargin)
if nargout > nargin
    error("variableNumArguments:TooManyOutputs", ...
        "Number of outputs must not exceed the number of inputs.")
end
varargout = cell(1,nargout);
for i = 1:nargout
    varargout{i} = class(varargin{i});
end
end

対話型テスト用にテスト ケースを作成します。次に、2 つの入力を指定し、同じ数の出力を要求した場合の variableNumArguments をテストします。関数が指定された例外をスローしないため、テストは失敗します。

testCase = matlab.unittest.TestCase.forInteractiveUse;
[c1,c2] = verifyError(testCase,@() variableNumArguments(1,'2'), ...
    "variableNumArguments:TooManyOutputs")
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyError failed.
    --> The function did not throw any exception.
        
        Expected Exception:
            'variableNumArguments:TooManyOutputs'
    
    Evaluated Function:
      function_handle with value:
    
        @()variableNumArguments(1,'2')
    ------------------
    Stack Information:
    ------------------
    In C:\work\TestFunctionWithVariableNumberOfInputsAndOutputsExample.m (TestFunctionWithVariableNumberOfInputsAndOutputsExample) at 22

c1 =

    'double'


c2 =

    'char'

variableNumArguments の呼び出し時に出力が多すぎる場合、識別子 "variableNumArguments:TooManyOutputs" で例外がスローされることを検証します。

[c1,c2,c3] = verifyError(testCase,@() variableNumArguments(1,'2'), ...
    "variableNumArguments:TooManyOutputs")
Verification passed.

c1 = 

  missing

    <missing>


c2 = 

  missing

    <missing>


c3 = 

  missing

    <missing>

ヒント

  • verifyError は便利なメソッドです。たとえば、verifyError(testCase,actual,identifier) は、以下のコードと機能的に等価です。

    import matlab.unittest.constraints.Throws
    testCase.verifyThat(actual,Throws(identifier))
    

    verifyThat を介して Throws 制約を直接使用した場合、さらに多くの機能が使用できます。

  • 検証検定を使用して、例外をスローせずにエラーを生成して記録します。検証では例外がスローされないため、すべてのテスト内容は検証エラーが発生しても最後まで実行されます。通常の場合、検証はテストを早期終了する必要がないため、ユニット テストの主な検定となります。前提条件の違反や不適切なテスト設定がないかどうかをテストするには、他の検定タイプを使用します。

    • テスト環境がテスト エラーを回避するために必要な前提条件を満たしていることを確認するには、仮定検定を使用してください。仮定エラーが発生するとテストのフィルター処理が行われ、テスト フレームワークによってテストが Incomplete としてマークされます。詳細については、matlab.unittest.qualifications.Assumable を参照してください。

    • エラー条件によって現在のテスト内容の残りが無効になっても、それ以降のテストは正しく実行される場合、アサーション検定を使用してください。アサーション地点におけるエラーによって、現在のテストが Failed および Incomplete となります。詳細については、matlab.unittest.qualifications.Assertable を参照してください。

    • エラーが発生した場合にテスト セッションを中止するには、致命的なアサーション検定を使用してください。これらの検定は、エラーがあまりに根本的なものであり、テストを続行する意義がない場合に役立ちます。致命的なアサーション検定は、フィクスチャの破棄で環境の状態が正しく復元されず、テストを中止して新しいセッションを開始する方が望ましい場合にも有益です。詳細については、matlab.unittest.qualifications.FatalAssertable を参照してください。

バージョン履歴

R2013a で導入