This example shows how to write a unit test for a MATLAB® function, quadraticSolver.m
.
This MATLAB function solves quadratic equations. Create this function in a folder on your MATLAB path.
function roots = 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 roots(1) = (-b + sqrt(b^2 - 4*a*c)) / (2*a); roots(2) = (-b - sqrt(b^2 - 4*a*c)) / (2*a); end
Create this function in a folder on your MATLAB path.
function tests = solverTest tests = functiontests(localfunctions); end
A call to functiontests
using
localfunctions
as input creates an array of tests from
each local function in the solverTest.m
file. Each test is a
local function that follows the naming convention of having ’test’ at the
beginning or end of the function name. Local functions that do not follow this
convention are not included in the test array. Test functions must accept a
single input argument into which the testing framework passes a function test
case object. The function uses this object for verifications, assertions,
assumptions, and fatal assertions. It contains a TestData
structure that allows data to be passed between setup, test, and teardown
functions.
Create a test function, testRealSolution
, to verify that quadraticSolver
returns the correct value for real solutions. For example, the equation x2 - 3x + 2 = 0
has real solutions x = 1
and x = 2
. This function calls quadraticSolver
with the inputs of this equation. The expected solution, expSolution
, is [2,1]
.
Use the qualification function, verifyEqual
, to compare the output of the function, actSolution
, to the desired output, expSolution
. If the qualification fails, the framework continues executing the test. Typically, when using verifyEqual
on floating point values, you specify a tolerance for the comparison. For more information, see matlab.unittest.constraints
.
Add this function to the solverTest.m
file.
function testRealSolution(testCase) actSolution = quadraticSolver(1,-3,2); expSolution = [2 1]; verifyEqual(testCase,actSolution,expSolution) end
Create a test to verify that quadraticSolver
returns the right value for imaginary solutions. For example, the equation x2 + 2x + 10 = 0
has imaginary solutions x = -1 + 3i
and x = -1 - 3i
. Typically, when using verifyEqual
on floating point values, you specify a tolerance for the comparison. For more information, see matlab.unittest.constraints
.
Add this function, testImaginarySolution
, to the solverTest.m
file.
function testImaginarySolution(testCase) actSolution = quadraticSolver(1,2,10); expSolution = [-1+3i -1-3i]; verifyEqual(testCase,actSolution,expSolution) end
The order of the tests within the solverTest.m
file does not matter because they are fully independent test cases.
The following is the complete solverTest.m
test file. Save this file in a folder on your MATLAB path.
function tests = solverTest tests = functiontests(localfunctions); end function testRealSolution(testCase) actSolution = quadraticSolver(1,-3,2); expSolution = [2 1]; verifyEqual(testCase,actSolution,expSolution) end function testImaginarySolution(testCase) actSolution = quadraticSolver(1,2,10); expSolution = [-1+3i -1-3i]; verifyEqual(testCase,actSolution,expSolution) end
Run the tests.
results = runtests('solverTest.m')
Running solverTest .. Done solverTest __________ results = 1x2 TestResult array with properties: Name Passed Failed Incomplete Duration Totals: 2 Passed, 0 Failed, 0 Incomplete. 0.19172 seconds testing time.
Both of the tests passed.
Cause one of the tests to fail by forcing roots
in quadraticSolver.m
to be real. Before ending the function, add the line: roots = real(roots);
. (Do not change solverTest.m
.) Save the file and run the tests.
results = runtests('solverTest.m')
Running solverTest . ================================================================================ Verification failed in solverTest/testImaginarySolution. --------------------- Framework Diagnostic: --------------------- verifyEqual failed. --> Complexity does not match. Actual Complexity: Real Expected Complexity: Complex Actual Value: -1 -1 Expected Value: -1.000000000000000 + 3.000000000000000i -1.000000000000000 - 3.000000000000000i ------------------ Stack Information: ------------------ In C:\work\solverTest.m (testImaginarySolution) at 14 ================================================================================ . Done solverTest __________ Failure Summary: Name Failed Incomplete Reason(s) =============================================================================== solverTest/testImaginarySolution X Failed by verification. results = 1x2 TestResult array with properties: Name Passed Failed Incomplete Duration Totals: 1 Passed, 1 Failed, 0 Incomplete. 0.043751 seconds testing time.
The imaginary test verification failed.
Restore quadraticSolver.m
to its previous, correct version by removing the roots = real(roots);
code.