Main Content

セットアップ関数と破棄関数を使用したテストの記述

この例では、ファイル フィクスチャおよびフレッシュ フィクスチャを使用して MATLAB® Figure のいくつかのプロパティに関するユニット テストを記述する方法を説明します。

axesPropertiesTest.m ファイルの作成

Figure のプロパティをテストするメイン関数を含むファイルを作成し、2 つのテスト関数を含めます。1 つの関数は "x" 軸の範囲が正しいことを確認し、もう 1 つの関数は表面の色が正しいことを確認します。

MATLAB パス上のフォルダーに、axesPropertiesTest.m を作成します。このファイルのメイン関数で、functiontests によって関数 localfunctions が呼び出されて、axesPropertiesTest.m 内の各ローカル関数からテスト配列が作成されます。

function tests = axesPropertiesTest
tests = functiontests(localfunctions);
end

ファイル フィクスチャ関数の作成

ファイル フィクスチャ関数は、テスト ファイルで 1 回だけ実行されるセットアップ コードと破棄コードです。これらのフィクスチャはテスト ファイル全体で共有されます。この例では、ファイル フィクスチャ関数によって一時フォルダーを作成し、それを現在の作業フォルダーとして設定します。また、テスト用の新しい Figure を作成して保存します。テストが完了すると、作業フォルダーが元に戻され、一時フォルダーと保存されている Figure が削除されます。

この例では、補助関数を使用して単純な Figure (赤い円柱) を作成します。より実践的なシナリオでは、このコードはテスト対象の製品の一部であり、計算コストが高くなるので、Figure を 1 回だけ作成し、テスト関数ごとの結果の個々のコピーを読み込むことになります。ただし、この例の場合は、補助関数を axesPropertiesTest に対するローカル関数として作成するものとします。この関数は、名前の先頭または最後に「test」が付いていないため、テスト配列には含まれません。

単純な赤色の円柱を作成する補助関数を記述し、それをローカル関数として axesPropertiesTest に追加します。

function f = createFigure
f = figure;
ax = axes('Parent',f);
cylinder(ax,10)
h = findobj(ax,'Type','surface');
h.FaceColor = [1 0 0];
end

ファイル テスト フィクスチャのセットアップ関数と破棄関数には、それぞれ、setupOnceteardownOnce という名前を付けなければなりません。これらの関数は、テスト フレームワークによって関数テスト ケース オブジェクトが自動的に渡される単一の入力引数 testCase を受け入れます。このテスト ケース オブジェクトに含まれている TestData 構造体によって、セットアップ関数、テスト関数および破棄関数の間でデータを渡すことが可能になります。この例では、TestData 構造体で、割り当てられているフィールドを使用して、元のパス、一時フォルダー名および Figure のファイル名が格納されます。

セットアップ関数と破棄関数を axesPropertiesTest のローカル関数として作成します。

function setupOnce(testCase)
% Create and change to temporary folder
testCase.TestData.origPath = pwd;
testCase.TestData.tmpFolder = "tmpFolder" + ...
    string(datetime('now','Format',"yyyyMMdd'T'HHmmss"));
mkdir(testCase.TestData.tmpFolder)
cd(testCase.TestData.tmpFolder)
% Create and save a figure
testCase.TestData.figName = 'tmpFig.fig';
aFig = createFigure;
saveas(aFig,testCase.TestData.figName)
close(aFig)
end

function teardownOnce(testCase)
delete(testCase.TestData.figName)
cd(testCase.TestData.origPath)
rmdir(testCase.TestData.tmpFolder)
end

フレッシュ フィクスチャ関数の作成

フレッシュ フィクスチャは、ファイル内の各テスト関数の前後で実行される関数レベルのセットアップ コードと破棄コードです。この例では、これらのセットアップ関数と破棄関数によって保存されている Figure を開き、ハンドルを見つけます。テストが完了すると、フレームワークによって Figure が閉じられます。

フレッシュ フィクスチャ関数には、それぞれ、setupteardown という名前を付けなければなりません。ファイル フィクスチャ関数と同様、これらの関数も単一の入力引数 testCase を受け入れます。この例では、これらの関数によって TestData 構造体に新しいフィールドが作成され、そのフィールドに Figure および Axes へのハンドルが格納されます。これにより、セットアップ関数、テスト関数および破棄関数の間で情報を渡すことが可能になります。

セットアップ関数と破棄関数を axesPropertiesTest のローカル関数として作成します。それぞれのテストについて保存されている Figure を開き、テストの独立性を確認します。

function setup(testCase)
testCase.TestData.Figure = openfig(testCase.TestData.figName);
testCase.TestData.Axes = findobj(testCase.TestData.Figure, ...
    'Type','Axes');
end

function teardown(testCase)
close(testCase.TestData.Figure)
end

テスト フレームワークは、カスタムのセットアップ コードと破棄コードに加え、フィクスチャを作成するためのいくつかのクラスを提供します。詳細については、matlab.unittest.fixturesを参照してください。

テスト関数の作成

それぞれのテストは、関数名の先頭または最後に「test」を付けるという命名規則に準拠するローカル関数です。この命名規則に準拠していないローカル関数はテスト配列には含まれません。セットアップ関数および破棄関数と同様、個々のテスト関数は単一の入力引数 testCase を受け入れなければなりません。このテスト ケース オブジェクトは、検証、アサーション、仮定および致命的なアサーションに使用します。

関数 testDefaultXLim では、x 軸の範囲が円柱を表示するのに十分なものであることを確認します。下限値は -10 未満であり、上限値は 10 より大きくなければなりません。これらの値は、補助関数で生成される Figure (原点を中心に 10 単位の半径をもつ円柱) から取得されます。このテスト関数は、関数 setupOnce で作成および保存された Figure を開き、座標軸の範囲をクエリして、範囲が正しいことを確認します。検定関数 verifyLessThanOrEqual および verifyGreaterThanOrEqual は、エラーの場合に表示するテスト ケース、実際の値、予期される値およびオプションの診断情報を入力として受け取ります。

関数 testDefaultXLimaxesPropertiesTest のローカル関数として作成します。

function testDefaultXLim(testCase)
xlim = testCase.TestData.Axes.XLim;
verifyLessThanOrEqual(testCase,xlim(1),-10, ...
    'Minimum x-limit was not small enough')
verifyGreaterThanOrEqual(testCase,xlim(2),10, ...
    'Maximum x-limit was not large enough')
end

関数 surfaceColorTest は、関数 setupOnce で作成および保存された Figure にアクセスします。surfaceColorTest は、円柱の表面の色をクエリして、それが赤色であることを確認します。赤色の RGB 値は [1 0 0] です。検定関数 verifyEqual は、エラーの場合に表示するテスト ケース、実際の値、予期される値およびオプションの診断情報を入力として受け取ります。通常、浮動小数点値に対して verifyEqual を使用する場合は、比較の許容誤差を指定します。詳細については、matlab.unittest.constraintsを参照してください。

関数 surfaceColorTestaxesPropertiesTest のローカル関数として作成します。

function surfaceColorTest(testCase)
h = findobj(testCase.TestData.Axes,'Type','surface');
co = h.FaceColor;
verifyEqual(testCase,co,[1 0 0],'Face color is incorrect')
end

これで、メイン関数、補助関数、ファイル フィクスチャ関数、フレッシュ フィクスチャ関数および 2 つのテスト関数を含む axesPropertiesTest.m ファイルが作成されました。テストを実行することができます。

テストの実行

次のステップは、関数 runtests を使用してテストを実行することです。この例では、runtests を呼び出すと、以下のステップが実行されます。

  1. メイン関数がテスト配列を作成します。

  2. ファイル フィクスチャ セットアップ関数が作業フォルダーを記録し、一時フォルダーを作成して、その一時フォルダーを作業フォルダーとして設定した後、Figure を生成して保存します。

  3. フレッシュ フィクスチャ セットアップ関数が、保存されている Figure を開き、ハンドルを見つけます。

  4. testDefaultXLim テストが実行されます。

  5. フレッシュ フィクスチャ破棄関数が Figure を閉じます。

  6. フレッシュ フィクスチャ セットアップ関数が、保存されている Figure を開き、ハンドルを見つけます。

  7. surfaceColorTest テストが実行されます。

  8. フレッシュ フィクスチャ破棄関数が Figure を閉じます。

  9. ファイル フィクスチャ破棄関数が、保存されている Figure を削除し、パスを元に戻して、一時フォルダーを削除します。

コマンド プロンプトで、テスト スイートを生成して実行します。

results = runtests('axesPropertiesTest.m')
Running axesPropertiesTest
..
Done axesPropertiesTest
__________
results = 
  1×2 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   2 Passed, 0 Failed, 0 Incomplete.
   0.5124 seconds testing time.

テスト結果の表の作成

table で使用可能な機能にアクセスするには、TestResult オブジェクトから 1 つ作成します。

rt = table(results)
rt=2×6 table
                     Name                      Passed    Failed    Incomplete    Duration      Details   
    _______________________________________    ______    ______    __________    ________    ____________

    {'axesPropertiesTest/testDefaultXLim' }    true      false       false       0.35239     {1×1 struct}
    {'axesPropertiesTest/surfaceColorTest'}    true      false       false       0.16001     {1×1 struct}

テスト結果を期間の昇順で並べ替えます。

sortrows(rt,'Duration')
ans=2×6 table
                     Name                      Passed    Failed    Incomplete    Duration      Details   
    _______________________________________    ______    ______    __________    ________    ____________

    {'axesPropertiesTest/surfaceColorTest'}    true      false       false       0.16001     {1×1 struct}
    {'axesPropertiesTest/testDefaultXLim' }    true      false       false       0.35239     {1×1 struct}

テスト結果を Excel® スプレッドシートにエクスポートします。

writetable(rt,'myTestResults.xls')

参考

|

関連するトピック