セットアップ関数と破棄関数を使用したテストの記述
この例では、ファイル フィクスチャおよびフレッシュ フィクスチャを使用して 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
ファイル テスト フィクスチャのセットアップ関数と破棄関数には、それぞれ、setupOnce
と teardownOnce
という名前を付けなければなりません。これらの関数は、テスト フレームワークによって関数テスト ケース オブジェクトが自動的に渡される単一の入力引数 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 が閉じられます。
フレッシュ フィクスチャ関数には、それぞれ、setup
と teardown
という名前を付けなければなりません。ファイル フィクスチャ関数と同様、これらの関数も単一の入力引数 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
は、エラーの場合に表示するテスト ケース、実際の値、予期される値およびオプションの診断情報を入力として受け取ります。
関数 testDefaultXLim
を axesPropertiesTest
のローカル関数として作成します。
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
を参照してください。
関数 surfaceColorTest
を axesPropertiesTest
のローカル関数として作成します。
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
を呼び出すと、以下のステップが実行されます。
メイン関数がテスト配列を作成します。
ファイル フィクスチャ セットアップ関数が作業フォルダーを記録し、一時フォルダーを作成して、その一時フォルダーを作業フォルダーとして設定した後、Figure を生成して保存します。
フレッシュ フィクスチャ セットアップ関数が、保存されている Figure を開き、ハンドルを見つけます。
testDefaultXLim
テストが実行されます。フレッシュ フィクスチャ破棄関数が Figure を閉じます。
フレッシュ フィクスチャ セットアップ関数が、保存されている Figure を開き、ハンドルを見つけます。
surfaceColorTest
テストが実行されます。フレッシュ フィクスチャ破棄関数が Figure を閉じます。
ファイル フィクスチャ破棄関数が、保存されている 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')
参考
matlab.unittest.fixtures
| matlab.unittest.constraints