Main Content

matlab.unittest.constraints.IsEqualTo クラス

パッケージ: matlab.unittest.constraints
スーパークラス: matlab.unittest.constraints.BooleanConstraint

等価性を比較する一般的な制約

説明

IsEqualTo クラスは、データの等価性を比較する制約を作成します。使用する比較タイプは、期待された値のデータ型によって制御されます。まず、テスト フレームワークは期待された値がオブジェクトであるかどうかをチェックします。オブジェクトは後続のチェックで使用されるメソッド (islogical など) をオーバーライドしている可能性があるため、このチェックが最初に実行されます。次のリストは、さまざまなテストの分類と説明を示しています。

データ型等価性比較メソッド
MATLAB® & Java® オブジェクト

期待された値が MATLAB または Java オブジェクトの場合、制約 IsEqualTo は、期待された値のオブジェクトに isequaln メソッドが定義されていればそれを呼び出します。定義されていない場合は isequal を呼び出します。チェックが false を返し、サポートする許容誤差が指定されている場合、制約 IsEqualTo は実際の値と期待される値のクラス、サイズ、スパース性の等価性をチェックしてから、値が許容誤差内にあるかどうかを判定します。

実際の値と期待される値のクラスとサイズが同じで、かつすべてのプロパティが等しいために、実際の値と期待される値が等しいことを制約が判定できる場合、IsEqualToisequal または isequaln を呼び出しません。

論理値

期待された値が logical である場合、制約は実際の値と期待された値のスパース性の等価性をチェックします。スパース性が一致する場合、制約は isequal メソッドで値を比較します。それ以外の場合、制約は満たされません。

数値

期待された値が numeric である場合、制約は実際の値と期待された値を、クラス、サイズ、スパース性、実数/複素数の等価性についてチェックします。これらすべてのチェックが一致する場合、制約は比較に isequaln メソッドを使用します。isequalntrue を返す場合、制約は満たされます。実数/複素数が一致しない場合または isequalnfalse を返す場合、サポートされる許容誤差が提供されていると、制約は比較でこの許容誤差を使用します。それ以外の場合、制約は満たされません。

文字列

期待された値が string である場合、制約は関数 strcmp を使用して実際の値と期待された値の等価性をチェックします。ただし、IgnoreCase プロパティが true の場合、文字列は strcmpi を使用して比較されます。IgnoreWhitespacetrue である場合は、空白文字が strcmp または strcmpi に渡される前に、すべての空白文字が実際の文字列および必要な文字列から削除されます。

構造体

期待された値が struct である場合、制約は実際の値と期待された値のフィールド数を比較します。フィールド数が等しくない場合、制約は満たされません。それ以外の場合、期待された値 struct の各フィールドは実際の値 struct に存在しなければなりません。任意のフィールド名が異なる場合、制約は満たされません。次に、フィールドを深さ優先検証で再帰的に比較します。基本的なデータ型 (論理、数値、文字列またはオブジェクト) が見つかるまで再帰が続行された後、前述したとおりに値が比較されます。

cell 配列

期待された値が cell 配列の場合、制約は実際の値と期待された値のサイズの等価性をチェックします。これらの値のサイズが等しくない場合、制約は満たされません。それ以外の場合、上記で説明したように、構造体のフィールドの場合と同じ方法で、配列の各要素が再帰的に比較されます。

テーブル

期待された値が table の場合、実際の値と期待された値のクラス、サイズ、table プロパティのそれぞれについて等価性をチェックします。これらの値のクラス、サイズまたは table プロパティが等しくない場合、制約は満たされません。その後、制約により各列変数のサイズと型が比較され、table の各行が深さ優先検証で再帰的に比較されます。基本的なデータ型 (論理、数値、文字列またはオブジェクト) が見つかるまで再帰が続行された後、前述したとおりに値が比較されます。

構築

IsEqualTo(expVal) は、等価性を比較する一般的な制約を提供します。

IsEqualTo(expVal,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加オプションをもつ制約を提供します。Name は一重引用符 ('') で囲まれていなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順番で指定できます。

入力引数

expVal

実際の値と比較する、期待される値。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

IgnoringCase

制約で大文字と小文字が区別されるかどうかを示すインジケーター。false または true (logical 0 または 1) として指定します。

既定値: false

IgnoringFields

struct の比較時に無視するフィールド。文字ベクトルの cell 配列または string 配列として指定します。

既定値: (空)

IgnoringWhitespace

制約で空白が区別されるかどうかを示すインジケーター。false または true (logical 0 または 1) として指定します。

既定値: false

Using

制約の作成に使用する特定の比較演算子。matlab.unittest.constraints.Comparator オブジェクトとして指定します。

既定値: (空)

Within

制約の作成に使用する許容誤差。matlab.unittest.constraints.Tolerance オブジェクトとして指定します。

既定値: (空)

プロパティ

Comparator

制約の作成に使用する特定の比較演算子。名前と値のペアの引数 'Using'matlab.unittest.constraints.Comparator オブジェクトとして指定します。

Expected

期待される値。この値が入力引数 expVal で指定された実際の値と比較されます。

IgnoreCase

制約で大文字と小文字が区別されるかどうかを示すインジケーター。名前と値のペアの引数 'IgnoringCase' で指定します。このプロパティは、入れ子構造体などの再帰のすべてのレベルで適用されます。

IgnoredFields

struct の比較時に無視されるフィールド。名前と値のペアの引数 'IgnoringFields' で指定します。このプロパティは、入れ子構造体などの再帰のすべてのレベルで適用されます。

IgnoreWhitespace

制約で空白が区別されるかどうかを示すインジケーター。名前と値のペアの引数 'IgnoringWhitespace' で指定します。このプロパティは、入れ子構造体などの再帰のすべてのレベルで適用されます。

Tolerance

制約の作成に使用される特定の許容誤差。名前と値のペアの引数 'Within'matlab.unittest.constraints.Tolerance オブジェクトとして指定します。このプロパティは、入れ子構造体などの再帰のすべてのレベルで適用されます。

コピーのセマンティクス

値。値クラスがコピー操作に与える影響については、オブジェクトのコピーを参照してください。

すべて折りたたむ

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

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.AbsoluteTolerance
import matlab.unittest.constraints.RelativeTolerance

testCase = TestCase.forInteractiveUse;

実際の値の 5 と期待された値が等しいことを検証します。

expVal = 5;
testCase.verifyThat(5,IsEqualTo(expVal))
Verification passed.

実際の値が 4.95 であると仮定します。実際の値と期待された値の差が 0.09 未満であることを検証します。

testCase.verifyThat(4.95,IsEqualTo(expVal,'Within',AbsoluteTolerance(0.09)))
Verification passed.

実際の値が 4.9 であると仮定します。実際の値と期待された値の差が 1% 未満であることを検証します。

testCase.verifyThat(4.9,IsEqualTo(expVal,'Within',RelativeTolerance(0.01)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> NumericComparator failed.
        --> The numeric values are not equal using "isequaln".
        --> RelativeTolerance failed.
            --> The error was not within relative tolerance.
            --> Failure table:
                    Actual    Expected           Error              RelativeError       RelativeTolerance
                    ______    ________    ___________________    ___________________    _________________
                     4.9         5        -0.0999999999999996    -0.0199999999999999          0.01       
        
        Actual Value:
           4.900000000000000
        Expected Value:
             5

2 つの値の差は 1% より大きくなります。

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

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.RelativeTolerance

testCase = TestCase.forInteractiveUse;

0.1*3 = 0.3 であることをテストします。

act = 0.1*3;
exp = 0.3;
testCase.verifyThat(act, IsEqualTo(exp))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> NumericComparator failed.
        --> The numeric values are not equal using "isequaln".
        --> Failure table:
                Actual    Expected           Error               RelativeError    
                ______    ________    ____________________    ____________________
                 0.3        0.3       5.55111512312578e-17    1.85037170770859e-16
        
        Actual Value:
           0.300000000000000
        Expected Value:
           0.300000000000000

このテストは、浮動小数点の演算の丸め誤差のため失敗になります。

許容誤差を使用して、浮動小数点数の比較を行います。2*eps の相対許容誤差内で 0.1*3 = 0.3 であることをテストします。

testCase.verifyThat(act, IsEqualTo(exp, ...
    'Within', RelativeTolerance(2*eps)))
Verification passed.

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

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo

testCase = TestCase.forInteractiveUse;

2 つの文字ベクトルが等しいことを検証します。

expVal = 'Hello';
testCase.verifyThat('Hello',IsEqualTo(expVal))
Verification passed.

実際の値の大文字小文字を変更して、等価性をテストします。

testCase.verifyThat('hello',IsEqualTo(expVal))
Verification failed.

---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> StringComparator failed.
    --> The character arrays are not equal.
    
    Actual char:
        hello
    Expected char:
        Hello

大文字小文字を無視して再度テストします。

testCase.verifyThat('hello',IsEqualTo(expVal,'IgnoringCase',true))
Verification passed.

空白を無視して 2 つの文字ベクトルをテストします。

expVal = 'a bc';
testCase.verifyThat('abc',IsEqualTo(expVal,'IgnoringWhitespace',true))
testCase.verifyThat('ab c',IsEqualTo(expVal,'IgnoringWhitespace',true))
Verification passed.
Verification passed.

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

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.RelativeTolerance
import matlab.unittest.constraints.PublicPropertyComparator

testCase = TestCase.forInteractiveUse;

timeseries の実際のオブジェクトと期待されたオブジェクトを定義します。実際のデータ点の 1 つを 1% ずらします。

expected = timeseries(1:10);
actual = expected;
actual.Data(7) = 1.01*actual.Data(7);

実際の値と期待された値が 2% の相対許容誤差の範囲内で等価であることをテストします。

testCase.verifyThat(actual, IsEqualTo(expected,...
    'Within', RelativeTolerance(.02)))
Verification failed.

---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> ObjectComparator failed.
    --> The objects are not equal using "isequal".
    --> The tolerance was ignored. The tolerance as specified does not support comparisons of timeseries values.
    
    Actual timeseries:
          timeseries
        
          Common Properties:
                    Name: 'unnamed'
                    Time: [10x1 double]
                TimeInfo: [1x1 tsdata.timemetadata]
                    Data: [1x1x10 double]
                DataInfo: [1x1 tsdata.datametadata]
        
          More properties, Methods
    Expected timeseries:
          timeseries
        
          Common Properties:
                    Name: 'unnamed'
                    Time: [10x1 double]
                TimeInfo: [1x1 tsdata.timemetadata]
                    Data: [1x1x10 double]
                DataInfo: [1x1 tsdata.datametadata]
        
          More properties, Methods

制約の構築で PublicPropertyComparator を使用します。

testCase.verifyThat(actual, IsEqualTo(expected,...
    'Within', RelativeTolerance(.02),...
    'Using', PublicPropertyComparator.supportingAllValues))
Interactive verification passed.

PublicPropertyComparator は、オブジェクトをすべて一度に比較するのではなく、それぞれのパブリック プロパティを個別に比較するため、テストはパスします。前のテストでは、ObjectComparatortimeseries オブジェクトを比較するので、timeseries クラスの isequal メソッドに依存します。実際の timeseries にずれがあるため、isequalfalse を返します。double 値の許容誤差は timeseries オブジェクトに直接適用できないため、比較演算子は許容誤差を適用しません。後のテストでは、比較演算子は double 値データを含むそれぞれのパブリック プロパティに許容誤差を適用しています。

バージョン履歴

R2013a で導入