Main Content

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

クラスベースのテストでのパラメーターの使用

多くの場合、テスト データのみが異なる一連のテストを実行する必要があります。たとえば、異なる入力に対して関数が予期した出力を生成することをテストする場合があります。この場合、テスト ロジックは同じであり、テスト間の唯一の差異は各関数呼び出しの実際の値と予期した値です。パラメーター化されたテストでは、異なるデータ値を使用して反復的にテストを実行するコードを実装できます。メソッドをパラメーター化すると、テスト フレームワークはパラメーター値ごとにメソッドを自動的に呼び出します。したがって、各値に個別のメソッドを実装する必要はありません。

テスト フレームワークを使用すると、さまざまなレベルでテスト クラスをパラメーター化できます。さらに、複数のパラメーターを指定してテスト クラス メソッドを呼び出す場合、異なるパラメーターの組み合わせについてメソッドを呼び出す方法を指定できます。

パラメーター化されたテストを作成する方法

matlab.unittest.TestCase クラスから派生したクラスは、フレームワーク固有のプロパティとメソッドの属性を使用して、テストのパラメーター化を実装できます。クラスベースのテストでデータをパラメーターとして指定するには、適切なパラメーター化の属性をもつ properties ブロックを使用してデータを指定します。次に、1 つ以上のメソッドに入力引数としてパラメーター化プロパティを渡します。

たとえば、SampleTest クラスについて考えてみます。このクラスは、TestParameter 属性をもつ properties ブロック内にプロパティを指定するため、パラメーター化されたテストを定義します。このプロパティが Test メソッドに渡され、検定の実行に使用されます。

classdef SampleTest < matlab.unittest.TestCase
    properties (TestParameter)
        Number = {1,2,'3',4,5};
    end
    methods(Test)
        function testDouble(testCase,Number)
            testCase.verifyClass(Number,'double')
        end
    end
end

Number は 5 つの要素をもつ cell 配列であるため、テスト クラスは 5 つの要素をもつパラメーター化テスト スイートになります。

suite = testsuite('SampleTest');
{suite.Name}'
ans =

  5×1 cell array

    {'SampleTest/testDouble(Number=value1)'}
    {'SampleTest/testDouble(Number=value2)'}
    {'SampleTest/testDouble(Number=value3)'}
    {'SampleTest/testDouble(Number=value4)'}
    {'SampleTest/testDouble(Number=value5)'}

パラメーター化プロパティに割り当てられた値は、空でない cell 配列または少なくとも 1 つのフィールドをもつスカラー構造体のいずれかでなければなりません。MATLAB® はプロパティ値を使用して、テスト スイートのパラメーター名と値を指定します。

  • プロパティ値が文字ベクトルの cell 配列である場合、MATLAB は、cell 配列の値からパラメーター名を生成します。それ以外の場合、MATLAB はパラメーター名を value1value2、…、valueN として指定します。

  • プロパティ値が構造体である場合、構造体のフィールドはパラメーター名を表し、構造体の値はパラメーター値を表します。わかりやすい名前をスイートに含めるには、cell 配列ではなく構造体を使用してパラメーターを定義します。

パラメーター化プロパティの初期化方法

パラメーター化プロパティを定義するときに、MATLAB でパラメーター名と値を生成できるようにプロパティを初期化しなければなりません。プロパティは、テスト クラスの読み込み時またはテスト スイートの作成時のいずれかに初期化できます。

  • クラスの読み込み時:MATLAB がテスト クラス定義を読み込むときにプロパティ値を決定できる場合、既定値を使用してプロパティを初期化します。既定値は properties ブロックで、または classdef ファイルのローカル関数を使用して指定できます。クラス定義内で値を割り当てる方法の詳細については、クラス定義内の式の評価を参照してください。

    クラスの読み込み時にパラメーター化プロパティを初期化する場合、プロパティに関連付けられているパラメーターはさまざまなテスト実行に対して固定されたままになります。パラメーター化されたテスト クラスからスイートを作成するたびに、フレームワークは同じパラメーター名と値を使用してテストを実行します。既定値をもつパラメーター化プロパティを使用する例については、基本的なパラメーター化テストの作成を参照してください。

  • スイートの作成時:クラスの読み込み時にパラメーターを決定できない場合、または決定しない場合、TestParameterDefinition 属性をもつ静的メソッドを使用してスイートの作成時にプロパティを初期化します。TestParameterDefinition メソッドでパラメーター化プロパティを初期化する場合、プロパティに関連付けられているパラメーターはさまざまなテスト実行に対して変化する場合があります。パラメーター化されたテスト クラスからスイートを作成するたびに、フレームワークは新しいパラメーター名と値を生成してテストを実行します。詳細については、Define Parameters at Suite Creation Timeを参照してください。

値をパラメーター化プロパティに割り当てた後は、変更しないでください。たとえば、既定値を使用してパラメーター化プロパティを初期化する場合、TestParameterDefinition メソッドを使用して既定値を上書きすることはできません。

1 つのパラメーターが複数のユニット テストで使用される可能性があります。同じパラメーターを使用するテストは、誤って相互に影響を与えることなく、個別に実行しなければなりません。また、テストの実行が同じテストの後続の再実行に影響してはなりません。テスト実行の独立性を確保するには、値オブジェクトでパラメーター化プロパティを初期化します。パラメーター値としてのハンドル オブジェクト (MATLAB グラフィックス オブジェクトなど) の使用は推奨されません。値オブジェクトおよびハンドル オブジェクトの動作の詳細については、ハンドル クラスと値クラスの比較を参照してください。

パラメーター化されたテストでハンドル オブジェクトをテストする必要がある場合は、関数ハンドルをパラメーター値として使用してそれらの関数ハンドルをテストで呼び出すことにより、間接的に作成することを検討してください。たとえば、パラメーター化されたテストを書き込んで、関数 figure と関数 uifigure で作成された Figure の既定の現在の点をテストします。

classdef FigureTest < matlab.unittest.TestCase
    properties (TestParameter)
        FigureType = {@figure, @uifigure};
    end
    methods(Test)
        function defaultCurrentPoint(testCase,FigureType)
            fig = FigureType();
            testCase.addTeardown(@close,fig)
            cp = fig.CurrentPoint;
            testCase.verifyEqual(cp,[0 0])
        end
    end
end

パラメーター化レベルの指定

クラス セットアップ、メソッド セットアップおよびテストの 3 つのレベルでテスト クラスをパラメーター化できます。各レベルでパラメーター化するには、パラメーター化のプロパティに特定のプロパティ属性が必要です。たとえば、最上位レベルで、TestClassSetup メソッドは、ClassSetupParameter 属性をもつ properties ブロックに定義されたプロパティを使用してパラメーター化できます。最下位レベルで、Test メソッドは、TestParameter 属性をもつ properties ブロックに定義されたプロパティを使用してパラメーター化できます。

次の表に、さまざまなパラメーター化レベルと、各レベルに必須のメソッドの属性およびプロパティの属性を示します。

パラメーター化レベルパラメーター化定義アクセス可能なパラメーター化プロパティ
メソッドの属性プロパティの属性
クラス セットアップ レベルTestClassSetupClassSetupParameterClassSetupParameter
メソッド セットアップ レベルTestMethodSetupMethodSetupParameterMethodSetupParameter および ClassSetupParameter
テスト レベルTestTestParameterTestParameterMethodSetupParameter、および ClassSetupParameter

パラメーター化されたメソッドは、メソッドが定義されているレベルに応じてパラメーター化プロパティにアクセスできます。

  • パラメーター化された TestClassSetup メソッドは、ClassSetupParameter 属性をもつパラメーター化プロパティにのみアクセスできます。

  • パラメーター化された TestMethodSetup メソッドは、MethodSetupParameter 属性または ClassSetupParameter 属性をもつパラメーター化プロパティにのみアクセスできます。

  • パラメーター化された Test メソッドは、すべてのパラメーター化プロパティにアクセスできます。

異なるレベルでテスト クラスをパラメーター化する方法の例については、高度なパラメーター化テストの作成を参照してください。

パラメーターを組み合わせる方法の指定

複数のパラメーター化プロパティをメソッドに渡す場合、ParameterCombination メソッド属性を使用してパラメーターを組み合わせる方法を指定できます。テスト フレームワークは、指定された組み合わせについてメソッドを呼び出します。

次の表に、異なるパラメーターの組み合わせ方針を示します。

ParameterCombination 属性メソッドの呼び出し
'exhaustive' (既定の設定)

メソッドはパラメーター値のすべての組み合わせについて呼び出されます。ParameterCombination 属性が指定されていない場合、テスト フレームワークはこの既定の組み合わせを使用します。

'sequential'

メソッドは、それぞれのパラメーターの対応する値で呼び出されます。各パラメーターは、同じ数の値を含まなければなりません。たとえば、メソッドに 2 つのパラメーター化プロパティが指定され、各プロパティが 3 つのパラメーター値を指定する場合、フレームワークはこのメソッドを 3 回呼び出します。

'pairwise'

メソッドは、パラメーター値の各ペアについて少なくとも 1 回呼び出されます。たとえば、メソッドに 3 つのパラメーター化プロパティが指定されている場合、テスト フレームワークでは、任意の 2 つのプロパティで指定されているパラメーター値のそれぞれの組み合わせについてメソッドが確実に呼び出されます。

'exhaustive' の組み合わせと比較して、'pairwise' の組み合わせは通常テスト数が少なくなり、テストの実行が高速になります。テスト フレームワークでは、値のペアのそれぞれについて確実にテストが少なくとも 1 回作成されますが、スイートのサイズ、テスト スイートの要素の順序または特定セットは予測できません。

クラス セットアップ レベル、メソッド セットアップ レベルおよびテスト レベルでパラメーターを組み合わせることができます。たとえば、メソッドの属性の組み合わせ TestMethodSetup, ParameterCombination = 'sequential' を使用して、MethodSetupParameter 属性をもつ properties ブロックで定義されたメソッド セットアップ レベルのパラメーターについて逐次の組み合わせを指定できます。

テスト パラメーターを組み合わせる方法の例については、基本的なパラメーター化テストの作成高度なパラメーター化テストの作成を参照してください。

テストでの外部パラメーターの使用

パラメーター化されたテストを作成するときに、入力をクラスベースのテストに挿入してパラメーターを再定義できます。テスト ファイルの外部で定義されたデータを指定するには、テスト スイートの作成時に Parameter インスタンスを作成して 'ExternalParameter' オプションを使用します。詳細については、パラメーター化されたテストでの外部パラメーターの使用を参照してください。

参考

| |

関連するトピック