Main Content

クラスを使用する単純なテスト ケースの記述

matlab.unittest.TestCaseクラスから継承するテスト クラス内でユニット テストを定義して MATLAB® プログラムをテストできます。クラスベースのテストのユニット テストは、1 単位のソフトウェアの正確性を判定するメソッドです。methods ブロック内で Test 属性を指定して定義され、値をテストしてエラーに対応するための検定を使用できます。クラスベースのテストの詳細については、MATLAB でのクラスベースのユニット テストの作成を参照してください。

この例では、現在のフォルダー内のファイルで定義された関数の正確性を検定するクラスベースのユニット テストを記述する方法を示します。関数 quadraticSolver は、2 次多項式の係数を入力として受け取り、その多項式の根を返します。係数を非数値として指定した場合、関数はエラーをスローします。

function r = quadraticSolver(a,b,c)
% quadraticSolver returns solutions to the
% quadratic equation a*x^2 + b*x + c = 0.

if ~isa(a,'numeric') || ~isa(b,'numeric') || ~isa(c,'numeric')
    error('quadraticSolver:InputMustBeNumeric', ...
        'Coefficients must be numeric.');
end

r(1) = (-b + sqrt(b^2 - 4*a*c)) / (2*a);
r(2) = (-b - sqrt(b^2 - 4*a*c)) / (2*a);

end

SolverTest クラスの作成

現在のフォルダー内の SolverTest.m という名前のファイルで、matlab.unittest.TestCase クラスをサブクラス化して SolverTest クラスを作成します。このクラスが関数 quadraticSolver のテストの場所になります。Test 属性を指定して methods ブロック内に 3 つのユニット テストを追加します。このそれぞれで関数 quadraticSolver の実数解、虚数解、およびエラー条件についてのテストを行います。各 Test メソッドは入力として TestCase インスタンスを受け入れなければなりません。ブロック内のテストの順序は重要ではありません。

最初に、quadraticSolver が特定の係数に対して正しい実数解を返すことを検証する Test メソッド realSolution を作成します。たとえば、方程式 x2-3x+2=0 には実数解 x=1x=2 があります。メソッドは、この方程式の係数を指定して quadraticSolver を呼び出します。次に、matlab.unittest.TestCaseverifyEqual メソッドを使用して、実際の出力 actSolution を想定される出力 expSolution と比較します。

classdef SolverTest < matlab.unittest.TestCase
    methods(Test)
        function realSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2 1];
            testCase.verifyEqual(actSolution,expSolution)
        end
    end
end

quadraticSolver が特定の係数に対して正しい虚数解を返すことを検証する 2 つ目の Test メソッド imaginarySolution を作成します。たとえば、方程式 x2+2x+10=0 には虚数解 x=-1+3ix=-1-3i があります。このメソッドで、前のメソッドと同じように、この方程式の係数を指定して quadraticSolver を呼び出し、verifyEqual メソッドを使用して実際の出力 actSolution を想定される出力 expSolution と比較します。

classdef SolverTest < matlab.unittest.TestCase
    methods(Test)
        function realSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2 1];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function imaginarySolution(testCase)
            actSolution = quadraticSolver(1,2,10);
            expSolution = [-1+3i -1-3i];
            testCase.verifyEqual(actSolution,expSolution)
        end
    end
end

最後に、quadraticSolver が数値以外の係数に対してエラーを生成することを検証する Test メソッド nonnumericInput を追加します。matlab.unittest.TestCaseverifyError メソッドを使用して、入力 1'-3'、および 2 を指定して関数を呼び出した場合に 'quadraticSolver:InputMustBeNumeric' で指定したエラーがスローされることをテストします。

classdef SolverTest < matlab.unittest.TestCase
    methods(Test)
        function realSolution(testCase)
            actSolution = quadraticSolver(1,-3,2);
            expSolution = [2 1];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function imaginarySolution(testCase)
            actSolution = quadraticSolver(1,2,10);
            expSolution = [-1+3i -1-3i];
            testCase.verifyEqual(actSolution,expSolution)
        end
        function nonnumericInput(testCase)
            testCase.verifyError(@()quadraticSolver(1,'-3',2), ...
                'quadraticSolver:InputMustBeNumeric')
        end
    end
end

SolverTest クラス内のテストの実行

SolverTest クラス内のすべてのテストを実行するには、クラスから TestCase オブジェクトを作成し、そのオブジェクトで runメソッドを呼び出します。この例では、3 つのすべてのテストにパスします。

testCase = SolverTest;
results = testCase.run
Running SolverTest
...
Done SolverTest
__________
results = 
  1×3 TestResult array with properties:

    Name
    Passed
    Failed
    Incomplete
    Duration
    Details

Totals:
   3 Passed, 0 Failed, 0 Incomplete.
   0.018753 seconds testing time.

いずれかの Test メソッドを指定して単一のテストを実行することもできます。特定の Test メソッドを実行するには、メソッドの名前を run に渡します。たとえば、realSolution メソッドを実行します。

result = run(testCase,'realSolution')
Running SolverTest
.
Done SolverTest
__________
result = 
  TestResult with properties:

          Name: 'SolverTest/realSolution'
        Passed: 1
        Failed: 0
    Incomplete: 0
      Duration: 0.0026
       Details: [1×1 struct]

Totals:
   1 Passed, 0 Failed, 0 Incomplete.
   0.0026009 seconds testing time.

参考

関連するトピック