Запись простого теста Используя функции

Этот пример показывает, как записать модульный тест на функцию MATLAB®, quadraticSolver.m.

Создание Функции quadraticSolver.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

Создание Функции solverTest

Создайте эту функцию в папке на вашем пути 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

Следующее является полным тестовым файлом 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

Запущение Тестов в Функции solverTest

Запущение тестов.

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.

Оба из тестов проходятся.

Представление Ошибки в quadraticSolver.m и Запущенных Тестах

Заставьте один из тестов перестать работать путем принуждения roots в quadraticSolver.m, чтобы быть действительными. Прежде, чем закончить функцию, добавьте строку: roots = real(roots);. (Не изменяйте solverTest.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);.

Смотрите также

Похожие темы