Этот пример показывает, как записать модульный тест на функцию MATLAB®, quadraticSolver.m
m.
Эта функция MATLAB решает квадратные уравнения. Создайте эту функцию в папке на вашем пути MATLAB.
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
Создайте эту функцию в папке на вашем пути MATLAB.
function tests = solverTest tests = functiontests(localfunctions); end
Вызов functiontests
с помощью localfunctions
в качестве входного параметра создает массив тестов от каждой локальной функции в файле solverTest.m
. Каждый тест является локальной функцией, которая следует соглашению о присвоении имен наличия 'теста' вначале или конца имени функции. Локальные функции, которые не следуют этому соглашению, не включены в тестовый массив. Тестовые функции должны принять единственный входной параметр, в который среда тестирования передает функциональный объект теста. Функция использует этот объект для верификаций, утверждений, предположений и критических утверждений. Это содержит структуру TestData
, которая позволяет данным быть переданными между настройкой, тестом и функциями отключения.
Создайте тестовую функцию, testRealSolution
, чтобы проверить, что quadraticSolver
возвращает правильное значение для действительных решений. Например, уравнение x2 - 3x + 2 = 0
имеет действительные решения x = 1
и x = 2
. Это вызовы функции quadraticSolver
с входными параметрами этого уравнения. Ожидаемым решением, expSolution
, является [2,1]
.
Используйте функцию проверки, verifyEqual
, чтобы сравнить вывод функции, actSolution
, к желаемому выводу, expSolution
. Если проверка перестала работать, среда продолжает выполнять тест. Как правило, при использовании verifyEqual
на значениях с плавающей точкой, вы задаете допуск к сравнению. Для получения дополнительной информации смотрите matlab.unittest.constraints
ограничения.
Добавьте эту функцию к файлу solverTest.m
.
function testRealSolution(testCase) actSolution = quadraticSolver(1,-3,2); expSolution = [2 1]; verifyEqual(testCase,actSolution,expSolution) end
Создайте тест, чтобы проверить, что quadraticSolver
возвращает правильное значение для мнимых решений. Например, уравнение x2 + 2x + 10 = 0
имеет мнимые решения x = -1 + 3i
и x = -1 - 3i
. Как правило, при использовании verifyEqual
на значениях с плавающей точкой, вы задаете допуск к сравнению. Для получения дополнительной информации смотрите matlab.unittest.constraints
ограничения.
Добавьте эту функцию, testImaginarySolution
, к файлу solverTest.m
.
function testImaginarySolution(testCase) actSolution = quadraticSolver(1,2,10); expSolution = [-1+3i -1-3i]; verifyEqual(testCase,actSolution,expSolution) end
Порядок тестов в файле solverTest.m
не имеет значения, потому что они - полностью независимые тесты.
Следующее является полным тестовым файлом solverTest.m
. Сохраните этот файл в папке на своем пути MATLAB.
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
Запущение тестов.
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.
Оба из тестов проходятся.
Заставьте один из тестов перестать работать путем принуждения roots
в quadraticSolver.m
, чтобы быть действительными. Прежде, чем закончить функцию, добавьте строку: roots = real(roots);
. (Не изменяйте solverTest.m
m.) Сохранили файл и запускают тесты.
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.
Мнимая тестовая проверка не выполнена.
Восстановите quadraticSolver.m
к его предыдущей, правильной версии путем удаления кода roots = real(roots);
.