アプリ テスト フレームワークの概要
MATLAB® アプリ テスト フレームワークを使用し、App Designer のアプリや関数 uifigure
を用いてプログラムによってビルドしたアプリをテストします。アプリ テスト フレームワークでは、ボタン押下やスライダーのドラッグなどの UI コンポーネント上での動作をプログラムから実行するテスト クラスの作成、およびアプリの動作検証を行うことができます。
アプリのテスト
テストの作成 – クラスベースのテストでは、matlab.uitest.TestCase
をサブクラス化することによってアプリ テスト フレームワークを使用できます。matlab.uitest.TestCase
は matlab.unittest.TestCase
のサブクラスであるため、検定、フィクスチャ、およびプラグインなどのユニット テスト フレームワークの機能にテストがアクセスすることができます。コマンド プロンプトでアプリ テスト フレームワークを試すには、matlab.uitest.TestCase.forInteractiveUse
を使用してテスト ケース インスタンスを作成します。
テストの内容 – 通常、アプリのテストでは matlab.uitest.TestCase
の press
、type
などの動作メソッドを使用してアプリ コンポーネントをプログラム的に操作してから、その結果の検定を実行します。たとえば、チェック ボックスを 1 つクリックし、その他のチェック ボックスが無効になることを検証するテストなどがあります。あるいは、テキスト ボックスに数値を入力し、アプリでその結果が正しく計算されることを検証するテストもあります。このタイプのテストでは、テストするアプリのプロパティを理解している必要があります。ボタン押下を検証するには、MATLAB がアプリ オブジェクトのどこにボタンのステータスを格納するかを把握していなければなりません。計算の結果を検証するには、アプリ内の結果にアクセスする方法を把握していなければなりません。
テストのクリーンアップ – ベスト プラクティスとしては、テストの後にアプリを削除する破棄アクションを含めます。通常、テスト メソッドは matlab.unittest.TestCase
の addTeardown
メソッドを使用してこのアクションを追加します。
アプリのロック – アプリ テストで Figure が作成されると、フレームワークはコンポーネントと外部の相互作用を防ぐためにその Figure を直ちにロックします。コマンド プロンプトで試すために matlab.uitest.TestCase.forInteractiveUse
のインスタンスを作成する場合、アプリ テスト フレームワークは UI コンポーネントをロックしません。
デバッグの目的で Figure のロックを解除するには、関数 matlab.uitest.unlock
を使用します。
警告の消去 – 場合によっては、アプリによってモーダル警告ダイアログ ボックスが表示され、アプリ コンポーネントを操作できなくなります。ダイアログ ボックスの背後にある Figure にアクセスするには、このダイアログ ボックスを閉じなければならない場合があります。Figure ウィンドウで警告ダイアログ ボックスをプログラムにより閉じるには、dismissAlertDialog
メソッドを使用します。
UI コンポーネントの動作のサポート
matlab.uitest.TestCase
の動作メソッドはさまざまな UI コンポーネントをサポートしています。
コンポーネント | 一般的な作成関数 | matlab.uitest.TestCase の動作メソッド | |||||
press | choose | drag | type | hover | chooseContextMenu | ||
座標軸 | axes | ✔ | ✔ | ✔ | ✔ | ||
ボタン | uibutton | ✔ | ✔ | ||||
ボタン グループ | uibuttongroup | ✔ | |||||
チェック ボックス | uicheckbox | ✔ | ✔ | ✔ | |||
日付ピッカー | uidatepicker | ✔ | ✔ | ||||
離散型ノブ | uiknob | ✔ | ✔ | ||||
ドロップ ダウン | uidropdown | ✔ | ✔ | ✔ | |||
編集フィールド (数値、テキスト) | uieditfield | ✔ | ✔ | ||||
イメージ | uiimage | ✔ | ✔ | ||||
ノブ | uiknob | ✔ | ✔ | ✔ | |||
リスト ボックス | uilistbox | ✔ | ✔ | ||||
メニュー | uimenu | ✔ | |||||
パネル | uipanel | ✔ | ✔ | ✔ | |||
極座標軸 | polaraxes | ✔ | ✔ | ✔ | |||
プッシュ ツール | uipushtool | ✔ | |||||
ラジオ ボタン | uiradiobutton | ✔ | ✔ | ✔ | |||
スライダー | uislider | ✔ | ✔ | ✔ | |||
スピナー | uispinner | ✔ | ✔ | ✔ | |||
状態ボタン | uibutton | ✔ | ✔ | ✔ | |||
スイッチ (ロッカー、スライダー、トグル) | uiswitch | ✔ | ✔ | ✔ | |||
タブ | uitab | ✔ | |||||
タブ グループ | uitabgroup | ✔ | |||||
テーブル | uitable | ✔ | ✔ | ✔ | |||
テキスト エリア | uitextarea | ✔ | ✔ | ||||
トグル ボタン | uitogglebutton | ✔ | ✔ | ✔ | |||
トグル ツール | uitoggletool | ✔ | ✔ | ||||
ツリー ノード | uitreenode | ✔ | ✔ | ||||
UI 座標軸 | uiaxes | ✔ | ✔ | ✔ | ✔ | ||
UI Figure | uifigure | ✔ | ✔ | ✔ | ✔ |
アプリ用テストの記述
この例では、プロットのサンプル サイズとカラーマップを変更するオプションをもつアプリ用テストの記述方法を説明します。プログラムによりアプリを操作して結果を検定するには、アプリ テスト フレームワークとユニット テスト フレームワークを組み合わせて使用します。
コマンド プロンプトで、アプリを含むフォルダーを MATLAB 検索パスに追加して、アプリにアクセスできるようにします。
addpath(fullfile(matlabroot,'examples','matlab','main'))
テスト前にこのアプリのプロパティを確認するには、コマンド プロンプトでアプリのインスタンスを作成します。
app = ConfigurePlotAppExample;
この手順はテストには必要ありませんが、アプリ テストで使用されるプロパティを確認しておくと役に立ちます。たとえば、アプリ オブジェクト内の [Update Plot] ボタンにアクセスするには app.UpdatePlotButton
を使用します。
matlab.uitest.TestCase
から継承するテスト クラスを作成します。
classdef testConfigurePlotAppExample < matlab.uitest.TestCase methods (Test) end end
サンプル サイズをテストするテスト メソッド test_SampleSize
を作成します。このテスト メソッドは、サンプル サイズを変更し、プロットを更新して、表面が指定のサンプル サイズを使用していることを検証します。addTeardown
の呼び出しは、テストの完了後にアプリを削除します。
classdef testConfigurePlotAppExample < matlab.uitest.TestCase methods (Test) function test_SampleSize(testCase) app = ConfigurePlotAppExample; testCase.addTeardown(@delete,app); testCase.type(app.SampleSizeEditField,12); testCase.press(app.UpdatePlotButton); ax = app.UIAxes; surfaceObj = ax.Children; testCase.verifySize(surfaceObj.ZData,[12 12]); end end end
カラーマップをテストする 2 番目のテスト メソッド test_Colormap
を作成します。このテスト メソッドは、カラーマップを選択し、プロットを更新して、プロットが指定のカラーマップを使用していることを検証します。以下に完全なコードを示します。
classdef testConfigurePlotAppExample < matlab.uitest.TestCase methods (Test) function test_SampleSize(testCase) app = ConfigurePlotAppExample; testCase.addTeardown(@delete,app); testCase.type(app.SampleSizeEditField,12); testCase.press(app.UpdatePlotButton); ax = app.UIAxes; surfaceObj = ax.Children; testCase.verifySize(surfaceObj.ZData,[12 12]); end function test_Colormap(testCase) app = ConfigurePlotAppExample; testCase.addTeardown(@delete,app); testCase.choose(app.ColormapDropDown,'Winter'); testCase.press(app.UpdatePlotButton); expectedMap = winter; ax = app.UIAxes; testCase.verifyEqual(ax.Colormap,expectedMap); end end end
コマンド プロンプトで、テストを実行します。
results = runtests('testConfigurePlotAppExample')
Running testConfigurePlotAppExample .. Done testConfigurePlotAppExample __________ results = 1×2 TestResult array with properties: Name Passed Failed Incomplete Duration Details Totals: 2 Passed, 0 Failed, 0 Incomplete. 5.0835 seconds testing time.