アプリ テスト フレームワークの概要
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 ウィンドウでダイアログ ボックスをプログラムによって操作するには、chooseDialog または dismissDialog メソッドを使用します。
UI コンポーネントの動作のサポート
matlab.uitest.TestCase の動作メソッドはさまざまな UI コンポーネントをサポートしています。
| コンポーネント | 一般的な作成関数 | matlab.uitest.TestCase の動作メソッド | ||||||
press | choose | drag | scroll | type | hover | chooseContextMenu | ||
| 座標軸 | axes | ✔ | ✔ | ✔ | ✔ | ✔ | ||
| ボタン | uibutton | ✔ | ✔ | |||||
| ボタン グループ | uibuttongroup | ✔ | ||||||
| チェック ボックス | uicheckbox | ✔ | ✔ | ✔ | ||||
| 日付ピッカー | uidatepicker | ✔ | ✔ | |||||
| 離散型ノブ | uiknob | ✔ | ✔ | |||||
| ドロップ ダウン | uidropdown | ✔ | ✔ | ✔ | ||||
| 編集フィールド (数値、テキスト) | uieditfield | ✔ | ✔ | |||||
| ハイパーリンク | uihyperlink | ✔ | ✔ | |||||
| イメージ | 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;
![{"String":"Figure Configure Plot contains an axes object and other objects of type uilabel, uidropdown, uibutton, uinumericeditfield. The axes object contains an object of type surface.","Tex":[],"LaTex":[]}](../../examples/matlab/win64/WriteATestForAnAppExample_01.png)
現在のフォルダー内の 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.