Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

verifyError

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

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

構文

verifyError(verifiable,actual,identifier)
verifyError(verifiable,actual,metaClass)
verifyError(___,diagnostic)
[output1,...,outputN] = verifyError(___)

説明

verifyError(verifiable,actual,identifier) は、actualidentifier と等しいエラー識別子をもつ例外をスローする関数ハンドルであることを検証します。

verifyError(verifiable,actual,metaClass) は、actual が例外をスローする関数ハンドルであり、その例外のタイプは metaClass で指定された meta.class インスタンスで定義されることを検証します。このメソッドでは、インスタンスがクラスと正確に一致する必要はありませんが、インスタンスは指定されたクラス階層内に存在しなければならず、その階層は MException クラスを含んでいる必要があります。

verifyError(___,diagnostic) は、さらに diagnostic の診断情報を検定に関連付けます。テスト フレームワークでは、テスト ランナーの構成に応じて検定にパスしたときか失敗したときに診断を表示する場合があります。既定では、フレームワークは検定に失敗したときにのみ診断を表示します。この既定の動作はテスト ランナーをカスタマイズしてオーバーライドできます。たとえば、失敗したイベントとパスしたイベントの両方の診断を表示するには、DiagnosticsOutputPlugin インスタンスを使用します

[output1,...,outputN] = verifyError(___) は、関数ハンドル actual の呼び出しから複数の出力引数を返します。この構文を使用して、関数ハンドルから要求される出力引数の数を制御します。関数ハンドルでエラーが発生した場合、出力のタイプはすべて missing になります。それ以外の場合、output1,...,outputNactual からの出力値です。この構文では、前述の構文の入力引数のいずれかを使用できます。

入力引数

verifiable

この matlab.unittest.TestCase インスタンスは、テストを実行しているフレームワークとの組み合わせで検証が成功か失敗かを判定するために使用します。

actual

テストする値。

identifier

エラー識別子。文字ベクトルとして指定します。

metaClass

meta.class のインスタンス。

diagnostic

検定に関連する診断情報。次のいずれかとして指定します。

  • string 配列

  • 文字配列

  • 関数ハンドル

  • matlab.unittest.diagnostics.Diagnostic オブジェクト

診断値は、非スカラー値になることがあります。詳細については、matlab.unittest.diagnostics.Diagnostic を参照してください。

すべて展開する

testCase = matlab.unittest.TestCase.forInteractiveUse;

% Passing scenarios
%%%%%%%%%%%%%%%%%%%%
verifyError(testCase, @() error('SOME:error:id','Error!'), 'SOME:error:id');
verifyError(testCase, @testCase.assertFail, ...
    ?matlab.unittest.qualifications.AssertionFailedException);
 
% Failing scenarios
%%%%%%%%%%%%%%%%%%%%
verifyError(testCase, 5, 'some:id', '5 is not a function handle');
verifyError(testCase, @testCase.verifyFail, ...
    ?matlab.unittest.qualifications.AssertionFailedException, ...
    'Verifications dont throw exceptions.');
verifyError(testCase, @() error('SOME:id'), 'OTHER:id', 'Wrong id');
verifyError(testCase, @() error('whoops'), ...
    ?matlab.unittest.qualifications.AssertionFailedException, ...
    'Wrong type of exception thrown');

予期せぬ条件 (入力が char) に対して関数が必要なエラー メッセージ testNonNumericInput をスローするかどうかをテストするための add5:InputMustBeNumeric を作成します。

ユニット テスト用の関数

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

TestCase クラス。このクラスにはテスト メソッドが含まれます。

classdef Add5Test < matlab.unittest.TestCase
    methods (Test)
        function testDoubleOut(testCase)
            actOutput = add5(1);
            testCase.verifyClass(actOutput,'double')
        end
        function testNonNumericInput(testCase)
            testCase.verifyError(@()add5('0'),'add5:InputMustBeNumeric')
        end
    end
end

Add5Test クラス ファイルからテスト スイートを作成します。

suite = matlab.unittest.TestSuite.fromFile('Add5Test.m')
result = run(suite);
Running Add5Test
..
Done Add5Test
__________

現在の作業フォルダーで、次のテスト用関数を作成します。この関数は 1 つの出力を返します。

function y = plusOne(x)
    y = x+1;
end

コマンド プロンプトで、多すぎる出力引数を使用して plusOne を呼び出します。

[~,~] = plusOne(41);
Error using plusOne
Too many output arguments.

エラー メッセージと識別子を表示します。

MException.last
ans = 

  MException with properties:

    identifier: 'MATLAB:TooManyOutputs'
       message: 'Too many output arguments.'
         cause: {0×1 cell}
         stack: [0×1 struct]

関数 plusOne の呼び出し時に要求された出力引数が多すぎるとエラーが発生し、そのエラーに識別子 MATLAB:TooManyOutputs があることを検証します。

testCase = matlab.unittest.TestCase.forInteractiveUse;
[~,~] = verifyError(testCase,@() plusOne(41),'MATLAB:TooManyOutputs');
Interactive verification passed.

ヒント

  • このメソッドは、以下と機能的に等価です。

    import matlab.unittest.constraints.Throws;
    verifiable.verifyThat(actual, Throws(identifier));
    verifiable.verifyThat(actual, Throws(metaClass));
    

    verifyThat を介して Throws 制約を直接使用した場合、使用できる機能の数が増えます。

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

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

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

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

R2013a で導入