Main Content

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 Write 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 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

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.

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

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 $${x}^{2}-3x+2=0$$ has real solutions $$x=1$$ and $$x=2$$. 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 = solverTest 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 $${x}^{2}+2x+10=0$$ has imaginary solutions $$x=-1+3i$$ and $$x=-1-3i$$. 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 = 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

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.89529 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.017825 seconds testing time.

`functiontests`

| `localfunctions`

| `runtests`