カスタム制約の作成
この例では、指定された値と期待される値のサイズが同じかどうかを判定するカスタムの制約を作成する方法を示します。
現在のフォルダー内のファイルに、matlab.unittest.constraints.Constraint
クラスから派生する IsSameSizeAs
という名前のクラスを作成します。クラス コンストラクターは期待値を受け入れ、そのサイズが実際の値のサイズと比較されます。期待値は ValueWithExpectedSize
プロパティに格納されます。Constraint
の実装を変更不可にすることが推奨されるため、プロパティの SetAccess
属性を immutable
に設定します。
classdef IsSameSizeAs < matlab.unittest.constraints.Constraint properties (SetAccess=immutable) ValueWithExpectedSize end methods function constraint = IsSameSizeAs(value) constraint.ValueWithExpectedSize = value; end end end
private
アクセスが指定された methods
ブロックで、実際の値と期待される値が同じサイズであるかどうかを判定する補助メソッド sizeMatchesExpected
を定義します。このメソッドは他の制約メソッドによって呼び出されます。
methods (Access=private) function tf = sizeMatchesExpected(constraint,actual) tf = isequal(size(actual), ... size(constraint.ValueWithExpectedSize)); end end
matlab.unittest.constraints.Constraint
クラスから派生するクラスで satisfiedBy
メソッドを実装する必要があります。このメソッドは、比較ロジックを含み、logical 値を返さなければなりません。methods
ブロック内で、補助メソッドを呼び出すことにより satisfiedBy
を実装します。実際のサイズと想定サイズが等しい場合、このメソッドは true
を返します。
methods function tf = satisfiedBy(constraint,actual) tf = constraint.sizeMatchesExpected(actual); end end
matlab.unittest.constraints.Constraint
クラスから派生するクラスで getDiagnosticFor
メソッドも実装する必要があります。このメソッドは、制約に対して実際の値を評価し、Diagnostic
オブジェクトを提供しなければなりません。この例では、getDiagnosticFor
は StringDiagnostic
オブジェクトを返します。
methods function diagnostic = getDiagnosticFor(constraint,actual) import matlab.automation.diagnostics.StringDiagnostic if constraint.sizeMatchesExpected(actual) diagnostic = StringDiagnostic("IsSameSizeAs passed."); else diagnostic = StringDiagnostic( ... "IsSameSizeAs failed." + newline + "Actual Size: [" ... + int2str(size(actual)) + "]" + newline ... + "Expected Size: [" ... + int2str(size(constraint.ValueWithExpectedSize)) ... + "]"); end end end
IsSameSizeAs
クラスの定義
以下は、IsSameSizeAs
クラスの完全なコードです。
classdef IsSameSizeAs < matlab.unittest.constraints.Constraint properties (SetAccess=immutable) ValueWithExpectedSize end methods function constraint = IsSameSizeAs(value) constraint.ValueWithExpectedSize = value; end function tf = satisfiedBy(constraint,actual) tf = constraint.sizeMatchesExpected(actual); end function diagnostic = getDiagnosticFor(constraint,actual) import matlab.automation.diagnostics.StringDiagnostic if constraint.sizeMatchesExpected(actual) diagnostic = StringDiagnostic("IsSameSizeAs passed."); else diagnostic = StringDiagnostic( ... "IsSameSizeAs failed." + newline + "Actual Size: [" ... + int2str(size(actual)) + "]" + newline ... + "Expected Size: [" ... + int2str(size(constraint.ValueWithExpectedSize)) ... + "]"); end end end methods (Access=private) function tf = sizeMatchesExpected(constraint,actual) tf = isequal(size(actual), ... size(constraint.ValueWithExpectedSize)); end end end
期待されるサイズのテスト
コマンド プロンプトで、対話型テスト用にテスト ケースを作成します。
import matlab.unittest.TestCase
testCase = TestCase.forInteractiveUse;
パスのケースをテストします。
testCase.verifyThat(zeros(5),IsSameSizeAs(repmat(1,5)))
Verification passed.
失敗のケースをテストします。
testCase.verifyThat(zeros(5),IsSameSizeAs(ones(1,5)))
Verification failed. --------------------- Framework Diagnostic: --------------------- IsSameSizeAs failed. Actual Size: [5 5] ExpectedSize: [1 5]
参考
クラス
matlab.unittest.constraints.Constraint
|matlab.unittest.constraints.BooleanConstraint
|matlab.automation.diagnostics.StringDiagnostic
|matlab.automation.diagnostics.Diagnostic