Main Content

使用类来编写简单测试用例

您可以通过在继承自 matlab.unittest.TestCase 类的测试类中定义单元测试来测试您的 MATLAB® 程序。基于类的测试中的单元测试是确定软件单元正确性的一种方法。它是在具有 Test 属性的 methods 代码块中定义的,可以使用鉴定来测试值和对失败进行响应。有关基于类的测试的详细信息,请参阅在 MATLAB 中编写基于类的单元测试

此示例说明如何编写基于类的单元测试来验证在当前文件夹的文件中定义的函数的正确性。quadraticSolver 函数接受二次多项式的系数作为输入,并返回该多项式的根。如果系数指定为非数值,该函数将引发错误。

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 代码块中添加三个单元测试。这些单元测试针对实数解、虚数解和错误条件来测试 quadraticSolver 函数。每个 Test 方法必须接受 TestCase 实例作为输入。测试在该块中的顺序无关紧要。

首先,创建一个 Test 方法 realSolution,以验证 quadraticSolver 返回特定系数的正确实数解。例如,方程 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

创建另一个 Test 方法 imaginarySolution,以验证 quadraticSolver 返回特定系数的正确虚数解。例如,方程 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

最后,添加 Test 方法 nonnumericInput,以验证 quadraticSolver 是否对非数值系数生成错误。使用 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 方法。在此示例中,所有三个测试都通过。

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.

另请参阅

相关主题