アプリ テスト フレームワークの概要
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 | ✔ | ✔ | ✔ | |||
ラベル | uilabel | ✔ | |||||
リスト ボックス | uilistbox | ✔ | ✔ | ||||
メニュー | uimenu | ✔ | |||||
パネル | uipanel | ✔ | ✔ | ✔ | |||
極座標軸 | polaraxes | ✔ | ✔ | ✔ | |||
プッシュ ツール | uipushtool | ✔ | |||||
ラジオ ボタン | uiradiobutton | ✔ | ✔ | ✔ | |||
スライダー | uislider | ✔ | ✔ | ✔ | |||
スピナー | uispinner | ✔ | ✔ | ✔ | |||
状態ボタン | uibutton | ✔ | ✔ | ✔ | |||
スイッチ (ロッカー、スライダー、トグル) | uiswitch | ✔ | ✔ | ✔ | |||
タブ | uitab | ✔ | |||||
タブ グループ | uitabgroup | ✔ | |||||
テーブル | uitable | ✔ | ✔ | ✔ | |||
テキスト エリア | uitextarea | ✔ | ✔ | ||||
トグル ボタン | uitogglebutton | ✔ | ✔ | ✔ | |||
トグル ツール | uitoggletool | ✔ | ✔ | ||||
ツリー ノード | uitreenode | ✔ | ✔ | ||||
UI 座標軸 | uiaxes | ✔ | ✔ | ✔ | ✔ | ||
UI Figure | uifigure | ✔ | ✔ | ✔ | ✔ |
例: アプリ用テストの記述
この例では、現在のフォルダー内のアプリ用にテストを記述する方法を示します。このアプリには、プロットのサンプル サイズとカラーマップを変更するオプションが用意されています。プログラムによりアプリを操作して結果を検定するには、アプリ テスト フレームワークとユニット テスト フレームワークを使用します。
テスト前にこのアプリのプロパティを確認するには、アプリのインスタンスを作成します。この手順はテストには必要ありませんが、テストで使用されるプロパティを確認しておくと役に立ちます。たとえば、アプリ内の [Update Plot] ボタンにアクセスするには app.UpdatePlotButton
を使用します。
app = ConfigurePlotAppExample;
現在のフォルダー内の ConfigurePlotAppExampleTest.m
という名前のファイルで、matlab.uitest.TestCase
から派生させたテスト クラスを作成します。2 つの Test
メソッドを ConfigurePlotAppExampleTest
クラスに追加します。各メソッドで、テストする前にアプリのインスタンスを作成し、テストの完了後にそのインスタンスを削除します。
testSampleSize
メソッド — サンプル サイズを変更し、プロットを更新して、プロットが指定のサンプル サイズを使用していることを検証します。testColormap
メソッド — カラーマップを選択し、プロットを更新して、プロットが指定のカラーマップを使用していることを検証します。
classdef ConfigurePlotAppExampleTest < matlab.uitest.TestCase methods (Test) function testSampleSize(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 testColormap(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("ConfigurePlotAppExampleTest")
Running ConfigurePlotAppExampleTest
.
. Done ConfigurePlotAppExampleTest __________
results = 1×2 TestResult array with properties: Name Passed Failed Incomplete Duration Details Totals: 2 Passed, 0 Failed, 0 Incomplete. 11.9555 seconds testing time.