matlab-testing について
matlab-testing は、matlab.unittest フレームワークで MATLAB のユニットテストを作成・実行するスキルです。クラスベースのテスト、カバレッジ、CI/CD、App Designer のテストを扱い、MCP ツールによる実行を案内します。
主な機能
- 01クラスベースのユニットテスト構成
- 02パラメーター化テスト、フィクスチャ、モック
- 03MCP によるテスト実行と結果分析
- 04カバレッジ分析と CI/CD のガイダンス
- 05App Designer の UI テストガイダンス
活用シーン
- 01MATLAB の関数やクラスのテスト作成
- 02テストスイートの実行と失敗項目の確認
- 03カバレッジ不足の特定と CI の設定
- 04UI 操作による App Designer アプリのテスト
MCP 対応
run_matlab_test_file と evaluate_matlab_code の MCP ツールを使ったテスト実行を案内します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-testingインストール後、Claude Code で/matlab-testingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreference/app-testing-guidance.mdconstraints-guidance.mdfixtures-guidance.mdmocking-guidance.mdparameterized-tests-guidance.mdtest-execution-guidance.mdscripts/printCoverageGaps.m詳細
テスト
matlab.unittest フレームワークを使用して、MATLAB の単体テストを生成、構成、実行します。クラスベースのテスト、パラメーター化テスト、フィクスチャ、モック、カバレッジ分析、CI/CD 統合、MCP 経由のアプリテストを扱います。
使用する場合
- MATLAB の関数またはクラスのテスト作成を求められた場合
- 既存のテストスイートを実行したい場合
- カバレッジ分析または CI/CD の構成が必要な場合
- テスト駆動開発 — 実装前にテストを作成する場合
- プログラムによるジェスチャーを使って App Designer アプリをテストする場合(reference/app-testing-guidance.md を参照)
使用しない場合
- Simulink モデルのテスト — Simulink テストスキルを使用してください
- パフォーマンスのベンチマーク — プロファイリングのワークフローを使用してください
必ず守るルール
- 最初にテスト計画を提示する — 複雑なテストスイートでは、コードを書く前に、テストメソッドとエッジケースを提案してユーザーの承認を得てください
- 常にクラスベースのテストを使用する — すべてのテストファイルは
matlab.unittest.TestCaseを継承する必要があります。スクリプトベースのテストは使用しないでください - テストメソッドにロジックを含めない —
if、switch、for、try/catchは使用しないでください。Arrange-Act-Assert に従ってください。テストに条件分岐が必要な場合は、メソッドを分割してください - 実装ではなく公開インターフェイスをテストする — プライベートメソッドを直接テストしないでください
- MCP 経由で実行する — テストの実行には
run_matlab_test_fileまたはevaluate_matlab_codeを使用してください
ワークフロー
簡単なテスト(動作が明確で、範囲が限定されている場合)
- テスト対象(メソッドと主なエッジケース)を簡潔に説明します
- ユーザーの確認後にテストファイルを作成します
標準的なテスト(大規模なコードベース、複数ファイルの場合)
- 要件を収集する — テスト対象のコード、期待される動作、エラー条件、範囲、依存関係
- テスト計画を提示する — テストメソッド、エッジケース、パラメーター化の方針を列挙し、承認を得ます
- 実装する — 以下のパターンに従ってテストを作成します
- 実行する —
run_matlab_test_fileMCP ツール経由で実行します - カバレッジを確認する — テストされていないパスを特定し、テストを追加します
主な関数
| カテゴリ | 関数 | 目的 |
|---|---|---|
| 等価性 | verifyEqual, verifyNotEqual | 値を比較します(浮動小数点数には AbsTol を使用) |
| 論理値 | verifyTrue, verifyFalse | 論理条件を確認します |
| サイズ/型 | verifySize, verifyClass, verifyEmpty | 構造を確認します |
| エラー | verifyError | 正しい ID でエラーがスローされることを確認します |
| 警告 | verifyWarning, verifyWarningFree | 警告の動作を確認します |
| 基盤 | runtests, TestSuite, TestRunner | テストを実行して整理します |
| カバレッジ | CodeCoveragePlugin, CoverageResult | テストカバレッジを測定します |
確認レベル
| レベル | 失敗時 | 使用する場面 |
|---|---|---|
verify | テストを続行します | デフォルト — ほとんどのアサーション |
assert | 現在のテストを停止します | セットアップの検証 |
fatal | スイート全体を停止します | 環境の前提条件 |
assume | テストをスキップします | 条件付き実行(例:ツールボックスの確認) |
パターン
基本的なテストクラス
classdef computeAreaTest < matlab.unittest.TestCase
%computeAreaTest Tests for the computeArea function.
methods (Test)
function testSquare(testCase)
result = computeArea(5, 5);
testCase.verifyEqual(result, 25);
end
function testFloatingPoint(testCase)
result = computeArea(1/3, 3);
testCase.verifyEqual(result, 1, AbsTol=1e-12);
end
function testNegativeInputErrors(testCase)
testCase.verifyError( ...
@() computeArea(-1, 5), 'computeArea:negativeInput');
end
end
end
パラメーター化テスト
アサーションのロジックがすべてのケースで同一で、データだけが異なる場合に限り、パラメーター化してください。読みやすいテスト名には構造体を使用します。
classdef unitConverterTest < matlab.unittest.TestCase
properties (TestParameter)
conversionCase = struct( ...
'freezing', struct('input', 0, 'expected', 32), ...
'boiling', struct('input', 100, 'expected', 212), ...
'bodyTemp', struct('input', 37, 'expected', 98.6));
end
methods (Test)
function testCelsiusToFahrenheit(testCase, conversionCase)
result = celsiusToFahrenheit(conversionCase.input);
testCase.verifyEqual(result, conversionCase.expected, AbsTol=1e-10);
end
end
end
高度なパラメーター化(組み合わせ、動的パラメーター、ClassSetupParameter)については、reference/parameterized-tests-guidance.md を参照してください。
セットアップ、ティアダウン、フィクスチャ
TestMethodTeardown ブロックよりも addTeardown を優先してください。ソースフォルダーの追加には PathFixture を使用します。
classdef fileProcessorTest < matlab.unittest.TestCase
methods (TestClassSetup)
function addSourceToPath(testCase)
srcFolder = fullfile(fileparts(fileparts(mfilename('fullpath'))), 'src');
testCase.applyFixture(matlab.unittest.fixtures.PathFixture(srcFolder, ...
IncludingSubfolders=true));
end
end
methods (Test)
function testProcessFile(testCase)
tmpDir = string(tempname);
mkdir(tmpDir);
testCase.addTeardown(@() rmdir(tmpDir, 's'));
testFile = fullfile(tmpDir, "data.csv");
writematrix(rand(10, 3), testFile);
result = processFile(testFile);
testCase.verifySize(result, [10 3]);
end
end
end
組み込みフィクスチャ、カスタムフィクスチャ、共有フィクスチャについては、reference/fixtures-guidance.md を参照してください。
決定性
再現可能なテストにするため、RNG のシードを設定し、ティアダウンで元に戻します。
methods (TestMethodSetup)
function resetRandomSeed(testCase)
originalRng = rng;
testCase.addTeardown(@() rng(originalRng));
rng(42, "twister");
end
end
テストタグ
選択的な実行には TestTags を使用します。
methods (Test, TestTags = {'Unit'})
function testFastCalculation(testCase)
% ...
end
end
methods (Test, TestTags = {'Integration', 'Slow'})
function testFullPipeline(testCase)
% ...
end
end
タグによる実行:runtests('tests', Tag='Unit') または runtests('tests', ExcludeTag='Slow')。
テストの実行
MCP 経由
テストファイルには run_matlab_test_file MCP ツールを使用します。フィルタリングを伴うインライン実行の場合:
results = runtests('tests'); % all tests in folder
results = runtests('tests', Tag='Unit'); % by tag
results = runtests('tests', Name='*Calculator*'); % by name pattern
results = runtests('tests', UseParallel=true); % parallel execution
results = runtests('tests', Strict=true); % warnings = failures
結果の分析
disp(results);
for r = results([results.Failed])
fprintf('\nFAILED: %s\n', r.Name);
disp(r.Details.DiagnosticRecord.Report);
end
カバレッジ分析
import matlab.unittest.TestRunner
import matlab.unittest.plugins.CodeCoveragePlugin
import matlab.unittest.plugins.codecoverage.CoverageResult
import matlab.unittest.plugins.codecoverage.CoverageReport
runner = TestRunner.withTextOutput;
covFormat = CoverageResult;
runner.addPlugin(CodeCoveragePlugin.forFolder('src', ...
Producing=[covFormat, CoverageReport('coverage-report')]));
results = runner.run(testsuite('tests'));
covResults = covFormat.Result;
disp(covResults);
カバレッジギャップを分析するには、reference/test-execution-guidance.md の printCoverageGaps スクリプトを使用します。
CI/CD 統合
CI パイプラインには、buildfile.m とともに buildtool を使用します。buildfile.m のテンプレートと CI 設定(GitHub Actions、Azure DevOps、GitLab CI)については、reference/test-execution-guidance.md を参照してください。
App Designer のテスト
プログラムによる UI ジェスチャー(press、choose、type、drag)を使ってアプリをテストする方法については、reference/app-testing-guidance.md を参照してください。
主なポイント:
matlab.unittest.TestCaseではなく、matlab.uitest.TestCaseを継承します- アプリの作成後、最初のジェスチャーを実行する前に
drawnowを呼び出します uilabel.Textは文字列("text")ではなく、文字ベクトル('text')と比較します.Enableはmatlab.lang.OnOffSwitchState.on/.offと比較します
参考資料
必要に応じて読み込んでください。ほとんどのテストでは、このファイルに記載された内容だけで十分です。
| 読み込むタイミング | 参考資料 |
|---|---|
| テストにセットアップ/ティアダウン、一時ディレクトリ、パス管理、共有状態が必要な場合 | reference/fixtures-guidance.md |
| 浮動小数点の許容誤差の選択、制約オブジェクト、カスタム制約が必要な場合 | reference/constraints-guidance.md |
| 複数のパラメーター、動的パラメーター、組み合わせ方法が必要な場合 | reference/parameterized-tests-guidance.md |
| コードが外部サービスに依存し、モックオブジェクトまたは依存性注入が必要な場合 | reference/mocking-guidance.md |
| CI でのテスト実行、buildtool の設定、カバレッジギャップ分析が必要な場合 | reference/test-execution-guidance.md |
| ジェスチャー、ダイアログ、非同期コールバックを使って App Designer アプリをテストする場合 | reference/app-testing-guidance.md |
規約
- 常に
matlab.unittest.TestCaseを継承するクラスベースのテストを使用します - テストファイルには
<functionName>Test.mという名前を付け、tests/ディレクトリに配置します - デフォルトでは
verifyの判定を使用します。一つのテストが失敗しても、すべてのテストを実行できます - すべての浮動小数点比較で
AbsTolを使用し、厳密な等価性には依存しません - テストメソッドにロジックを含めず、Arrange-Act-Assert に従います
- クリーンアップには
addTeardownを使用します。テストが失敗した場合も実行されます - 読みやすいパラメーター化テスト名には、構造体ベースの
TestParameterを使用します - テストメソッドは目的を絞り、一つのメソッドにつき一つの動作をテストします
- テストは互いに独立し、並列実行に対応している必要があります
- 結果を自動取得するには、
run_matlab_test_fileMCP ツールでテストを実行します
Copyright 2026 The MathWorks, Inc.