Write Simple Test Case Using Functions
You can test your MATLAB® program by defining unit tests within a single file that contains a main function and local test functions. In a function-based test, each local function executes a portion of the software and qualifies the correctness of the produced result. For more information about function-based tests, see Function-Based Unit Tests.
This example shows how to write a function-based test 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 Tests
To test the quadraticSolver
function, create the test file quadraticSolverTest.m
in your current folder. Then, define a main function and two local functions in the file to test quadraticSolver
against real and imaginary solutions. The name of the main and local functions must start or end with the word "test", which is case-insensitive. Additionally, the name of the main function must correspond to the name of your test file.
Define Main Function
To run function-based unit tests, you must define a main function that collects all of the local test functions into a test array. Define the main function quadraticSolverTest
in your test file. The main function calls functiontests
to generate the test array tests
. Pass localfunctions
to functiontests
to automatically generate a cell array of function handles to the local functions in your file.
function tests = quadraticSolverTest tests = functiontests(localfunctions); end
Define Local Test Functions
Add local functions to the test file to test the quadraticSolver
function against real and imaginary solutions. The order of the tests within the file does not matter. Each local function must accept a single input testCase
, which is a matlab.unittest.FunctionTestCase
object. The testing framework automatically generates this object. The function uses the object to perform qualifications for testing values and responding to failures.
Define a local function testRealSolution
to verify that quadraticSolver
returns the correct real solutions for specific coefficients. For example, the equation has real solutions and . The function calls quadraticSolver
with the coefficients of this equation. Then, it uses the verifyEqual
qualification function to compare the actual output actSolution
to the expected output expSolution
.
function tests = quadraticSolverTest tests = functiontests(localfunctions); end function testRealSolution(testCase) actSolution = quadraticSolver(1,-3,2); expSolution = [2 1]; verifyEqual(testCase,actSolution,expSolution) end
Define a second local function testImaginarySolution
to verify that quadraticSolver
returns the correct imaginary solutions for specific coefficients. For example, the equation has imaginary solutions and . Just like the previous function, this function calls quadraticSolver
with the coefficients of this equation, and then uses the verifyEqual
qualification function to compare the actual output actSolution
to the expected output expSolution
.
function tests = quadraticSolverTest 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 Tests in Test File
Use the runtests
function to run the tests defined in the quadraticSolverTest.m
file. In this example, both of the tests pass.
results = runtests('quadraticSolverTest.m')
Running quadraticSolverTest .. Done quadraticSolverTest __________
results = 1×2 TestResult array with properties: Name Passed Failed Incomplete Duration Details Totals: 2 Passed, 0 Failed, 0 Incomplete. 0.016572 seconds testing time.
You also can run tests using the run
function.
results = run(quadraticSolverTest)
Running quadraticSolverTest .. Done quadraticSolverTest __________
results = 1×2 TestResult array with properties: Name Passed Failed Incomplete Duration Details Totals: 2 Passed, 0 Failed, 0 Incomplete. 0.0072908 seconds testing time.
See Also
runtests
| functiontests
| localfunctions