はじめに
C++でコードを書くとき、私はdoxygenを使うことを前提に常にヘッダーファイルにコメントを記入する習慣がついています。ところが、MATLABスクリプトを書くときは、ほとんど授業の宿題やプロットの作成が主の(ほぼ)使い捨てのスクリプトなので、コメントやテストを書く必要性が乏しく、MATLABのヘルプや単体テスト機能についてほとんど知りませんでした。
しかし、C++で書いていたライブラリの機能の一部をMATLABのパッケージとして移植する過程で、MATLABの`ヘルプや単体テスト機能を調べたので、備忘録として簡単にまとめておきます。
参考リンク
- MathWorks Documentation:
クラスや関数にヘルプ用コメントを加える
関数やクラスの宣言の直下にコメントを加えると、help
やdoc
コマンドを使ったときにそのコメントが表示されます。
例えば次のような関数をrotateTensor.m
ファイルに作成し、
function B = rotateTensor(A,R)
% B = ROTATETENSOR(A,R) - Rotate tensor A using a given rotation matrix R
B = R*A*R';
end
この関数をhelp
コマンドを通して呼び出すと、コメント部分が表示されます。
>> help rotateTensor
B = rotateTensor(A,R) - Rotate tensor A using a given rotation matrix R
クラスの場合も同様に、クラス定義の直下に書かれているコメントがヘルプコマンドで表示されます。
クラスの各プロパティやメソッド直下に書かれたコメントは、各プロパティやメソッドを指定してhelp
コマンドに渡すと表示されます。
>> help [ClassName].[PropertyName]
>> help [ClassName].[MethodName]
ヘルプ概要ファイルを作成する
ヘルプ概要ファイルとは、フォルダに置かれたContents.m
という名前のファイルで、そのフォルダのプログラムの概要を提供します。ヘルプ概要ファイルが作成されていると、help
コマンドを使ってそのフォルダの概要を表示させることができます。
>> help [FolderName]
ヘルプ概要ファイルには、フォルダに含まれる関数・クラスの機能についてコメントを書いておきます。詳しくはMathWorksのドキュメンテーションを参考にしてください。
単体テストの作成
MATLABは単体テストのフレームワークを提供しています。
の3つの書き方がありますので、好きなものを選んで単体テストを書きましょう。
それぞれの書き方の詳細についてはMathWorksのドキュメンテーションを参照してください。
ここではスクリプトベースの書き方について簡単に解説します。
単体テストのスクリプトには
- スクリプトファイル名の先頭または末尾は
test
でなければならない(大文字小文字は区別されない)。 - 各単体テストはスクリプトファイルの個別のセクション(
%%
で始まる行)に配置する。 - テストスクリプトでは、最初のセクション (
%%
で始まる最初の行) の前に定義された変数が共有変数となる。共有変数は各テスト内で変更可能だが、テストごとに最初の値にリセットされる。
という決まりがあります。
スクリプトを作成したらruntests
コマンドを使ってテストを実行することができます。例えば次のようなmyUnitTest.m
という単体テストスクリプトがあったとして
% test vector operations
v1 = [1 2 3];
v2 = [3 4 5];
%% Test 1: sum of vectors
v = v1 + v2;
assert(all(v == [4 6 8]))
%% Test 2: dot product of vectors
v = dot(v1, v2);
assert(v == 26)
%% Test 3: cross product of vectors
v = cross(v1, v2);
assert(dot(v,v1) == 0 && dot(v,v2) == 0)
%% Test 4: outer product of vectors
v = kron(v1',v2);
assert(all(all(v == [3 4 5; 6 8 10; 9 12 15])))
このスクリプトを実行するには下記コマンドを入力します。
>> result = runtests('myUnitTest')
myUnitTest を実行しています
....
myUnitTest が完了しました
__________
result =
1×4 TestResult 配列のプロパティ:
Name
Passed
Failed
Incomplete
Duration
Details
合計:
4 Passed, 0 Failed, 0 Incomplete.
0.018604 秒間のテスト時間。