Этот пример показывает, как записать модульный тест на функцию 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);.