Write Simple Test Case Using Classes
You can test your MATLAB® program by defining unit tests within a test class that inherits from the matlab.unittest.TestCase
class. A unit test in a class-based test is a method that determines the correctness of a unit of software. It is defined within a methods
block with the Test
attribute and can use qualifications for testing values and responding to failures. For more information about class-based tests, see Class-Based Unit Tests.
This example shows how to write class-based unit tests to qualify the correctness of a function defined in a file in your current folder. The quadraticSolver
function takes as inputs the coefficients of a quadratic polynomial and returns the roots of that polynomial. If the coefficients are specified as nonnumeric values, the function throws an error.
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
Create SolverTest Class
In a file named SolverTest.m
in your current folder, create the SolverTest
class by subclassing the matlab.unittest.TestCase
class. This class provides a place for tests for the quadraticSolver
function. Add three unit tests inside a methods
block with the Test
attribute. These test the quadraticSolver
function against real solutions, imaginary solutions, and error conditions. Each Test
method must accept a TestCase
instance as an input. The order of the tests within the block does not matter.
First, create a Test
method realSolution
to verify that quadraticSolver
returns the correct real solutions for specific coefficients. For example, the equation has real solutions and . The method calls quadraticSolver
with the coefficients of this equation. Then, it uses the verifyEqual
method of matlab.unittest.TestCase
to compare the actual output actSolution
to the expected output 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
Create a second Test
method imaginarySolution
to verify that quadraticSolver
returns the correct imaginary solutions for specific coefficients. For example, the equation has imaginary solutions and . Just like the previous method, this method calls quadraticSolver
with the coefficients of this equation, and then uses the verifyEqual
method to compare the actual output actSolution
to the expected output 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
Finally, add a Test
method nonnumericInput
to verify that quadraticSolver
produces an error for nonnumeric coefficients. Use the verifyError
method of matlab.unittest.TestCase
to test that the function throws the error specified by 'quadraticSolver:InputMustBeNumeric'
when it is called with inputs 1
, '-3'
, and 2
.
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
Run Tests in SolverTest Class
To run all of the tests in the SolverTest
class, create a TestCase
object from the class and then call the run
method on the object. In this example, all three tests pass.
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.
You also can run a single test specified by one of the Test
methods. To run a specific Test
method, pass the name of the method to run
. For example, run the realSolution
method.
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.