В этом примере показано, как записать скрипт, который тестирует функцию, которую вы создаете. Функция, взятая в качестве примера, вычисляет углы прямоугольного треугольника, и вы создаете модульный тест на основе скриптов, чтобы протестировать функцию.
Создайте эту функцию в файле, rightTri.m
, в вашей текущей папке MATLAB®. Эта функция берет длины двух сторон треугольника, как введено и возвращает три угла соответствующего прямоугольного треугольника. Входные стороны являются двумя более короткими ребрами треугольника, не гипотенузой.
function angles = rightTri(sides) A = atand(sides(1)/sides(2)); B = atand(sides(2)/sides(1)); hypotenuse = sides(1)/sind(A); C = asind(hypotenuse*sind(A)/sides(1)); angles = [A B C]; end
В вашей рабочей папке создайте новый скрипт, rightTriTest.m
. Каждый модульный тест проверяет различный выход rightTri
функция. Тестовый скрипт должен соответствовать следующим соглашениям:
Имя тестового файла должно начинаться или заканчиваться словом 'тест', который является нечувствительным к регистру. Если имя файла не начинается или заканчивается словом 'тест', тесты в файле могут быть проигнорированы в определенных случаях.
Поместите каждый модульный тест в отдельный участок файла скрипта. Каждый раздел начинается с двух знаков процента (%%
), и текст, который следует в той же линии становится именем тестового элемента. Если никакой текст не следует за %%
, MATLAB присваивает имя к тесту. Если MATLAB сталкивается с непройденным тестом, он все еще запускает остающиеся тесты.
В тестовом скрипте раздел совместно используемой переменной состоит из любого кода, который появляется перед первой явной секцией кода (первая линия, начинающаяся с %%
). Тесты совместно используют переменные, которые вы задаете в этом разделе. В тесте можно изменить значения этих переменных. Однако в последующих тестах, значение сбрасывается к значению, заданному в разделе совместно используемых переменных.
В разделе совместно используемых переменных (первая секция кода), задайте любые предусловия, необходимые для ваших тестов. Если вводы или выводы не соответствуют этому предусловию, MATLAB не запускает ни одного из тестов. MATLAB отмечает тесты, как отказавший и неполный.
Когда скрипт запущен как тест, переменные, заданные в одном тесте, не доступны в других тестах, если они не заданы в разделе совместно используемых переменных (первая секция кода). Точно так же переменные, заданные в других рабочих областях, не доступны для тестов.
Если файл скрипта не включает секций кода, MATLAB генерирует единичный тестовый элемент от полного содержимого файла скрипта. Имя тестового элемента совпадает с именем файла скрипта. В этом случае, если MATLAB сталкивается с проваленным тестом, он останавливает выполнение целого скрипта.
В rightTriTest.m
, запишите четыре теста, чтобы протестировать выход rightTri
. Используйте assert
функционируйте, чтобы протестировать различные условия. В разделе совместно используемых переменных задайте четыре треугольных конфигураций и задайте предусловие что rightTri
функция возвращает прямоугольный треугольник.
% test triangles tri = [7 9]; triIso = [4 4]; tri306090 = [2 2*sqrt(3)]; triSkewed = [1 1500]; % preconditions angles = rightTri(tri); assert(angles(3) == 90,'Fundamental problem: rightTri not producing right triangle') %% Test 1: sum of angles angles = rightTri(tri); assert(sum(angles) == 180) angles = rightTri(triIso); assert(sum(angles) == 180) angles = rightTri(tri306090); assert(sum(angles) == 180) angles = rightTri(triSkewed); assert(sum(angles) == 180) %% Test 2: isosceles triangles angles = rightTri(triIso); assert(angles(1) == 45) assert(angles(1) == angles(2)) %% Test 3: 30-60-90 triangle angles = rightTri(tri306090); assert(angles(1) == 30) assert(angles(2) == 60) assert(angles(3) == 90) %% Test 4: Small angle approximation angles = rightTri(triSkewed); smallAngle = (pi/180)*angles(1); % radians approx = sin(smallAngle); assert(approx == smallAngle, 'Problem with small angle approximation')
Протестируйте 1 тест суммирование треугольных углов. Если суммирование не равно 180 градусам, assert
выдает ошибку.
Протестируйте 2 теста, что, если две стороны равны, соответствующие углы равны. Если непрямые углы не оба равны 45 градусам, assert
функционируйте выдает ошибку.
Протестируйте 3 теста это, если треугольными сторонами является 1
и sqrt(3)
, углы равняются 30, 60, и 90 градусов. Если это условие не верно, assert
выдает ошибку.
Протестируйте 4 теста малое угловое приближение. Малое угловое приближение утверждает, что для маленьких углов синус угла в радианах приблизительно равен углу. Если это не верно, assert
выдает ошибку.
Выполните runtests
функционируйте, чтобы запустить эти четыре теста в rightTriTest.m
. runtests
функция выполняет каждый тест в каждой секции кода индивидуально. Если Тест 1 сбой, MATLAB все еще запускает остающиеся тесты. Если вы выполняете rightTriTest
как скрипт вместо при помощи runtests
, MATLAB останавливает выполнение целого скрипта, если это сталкивается с не пройдено утверждением. Кроме того, когда вы запускаете тесты с помощью runtests
функция, MATLAB обеспечивает информативный диагностический тест.
result = runtests('rightTriTest');
Running rightTriTest .. ================================================================================ Error occurred in rightTriTest/Test3_30_60_90Triangle and it did not run to completion. --------- Error ID: --------- 'MATLAB:assertion:failed' -------------- Error Details: -------------- Error using rightTriTest (line 31) Assertion failed. ================================================================================ . ================================================================================ Error occurred in rightTriTest/Test4_SmallAngleApproximation and it did not run to completion. --------- Error ID: --------- '' -------------- Error Details: -------------- Error using rightTriTest (line 39) Problem with small angle approximation ================================================================================ . Done rightTriTest __________ Failure Summary: Name Failed Incomplete Reason(s) =========================================================================== rightTriTest/Test3_30_60_90Triangle X X Errored. --------------------------------------------------------------------------- rightTriTest/Test4_SmallAngleApproximation X X Errored.
Тест для 30-60-90
треугольник и тест для малого углового приближения перестали работать по сравнению с числами с плавающей запятой. Как правило, когда вы сравниваете значения с плавающей точкой, вы задаете допуск к сравнению. В Тесте 3 и Тесте 4, MATLAB выдает ошибку в не пройдено утверждении и не завершает тест. Поэтому тест отмечен как оба Failed
и Incomplete
.
Предоставить диагностическую информацию (Error Details
) это более информативно, чем 'Assertion failed'
(Протестируйте 3), рассмотрите передачу сообщения к assert
функция (как в Тесте 4). Или можно также рассмотреть использование функциональных модульных тестов.
Сохраните rightTriTest.m
как rightTriTolTest.m
, и пересмотрите Тест 3 и Тест 4, чтобы использовать допуск. В Тесте 3 и Тесте 4, вместо того, чтобы утверждать, что углы равны ожидаемому значению, утверждают, что различие между фактическими и ожидаемыми значениями меньше чем или равно заданному допуску. Задайте допуск в разделе совместно используемых переменных тестового скрипта, таким образом, это доступно для обоих тестов.
Для модульных тестов на основе скриптов вручную проверьте, что различие между двумя значениями меньше заданного допуска. Если вместо этого вы пишете функциональный модульный тест, можно получить доступ к встроенным ограничениям, чтобы задать допуск при сравнении значений с плавающей точкой.
% test triangles tri = [7 9]; triIso = [4 4]; tri306090 = [2 2*sqrt(3)]; triSkewed = [1 1500]; % Define an absolute tolerance tol = 1e-10; % preconditions angles = rightTri(tri); assert(angles(3) == 90,'Fundamental problem: rightTri not producing right triangle') %% Test 1: sum of angles angles = rightTri(tri); assert(sum(angles) == 180) angles = rightTri(triIso); assert(sum(angles) == 180) angles = rightTri(tri306090); assert(sum(angles) == 180) angles = rightTri(triSkewed); assert(sum(angles) == 180) %% Test 2: isosceles triangles angles = rightTri(triIso); assert(angles(1) == 45) assert(angles(1) == angles(2)) %% Test 3: 30-60-90 triangle angles = rightTri(tri306090); assert(abs(angles(1)-30) <= tol) assert(abs(angles(2)-60) <= tol) assert(abs(angles(3)-90) <= tol) %% Test 4: Small angle approximation angles = rightTri(triSkewed); smallAngle = (pi/180)*angles(1); % radians approx = sin(smallAngle); assert(abs(approx-smallAngle) <= tol, 'Problem with small angle approximation')
Повторно выполните тесты.
result = runtests('rightTriTolTest');
Running rightTriTolTest .... Done rightTriTolTest __________
Вся тестовая передача.
Составьте таблицу результатов испытаний.
rt = table(result)
rt = 4×6 table Name Passed Failed Incomplete Duration Details _________________________________________________ ______ ______ __________ _________ ____________ {'rightTriTolTest/Test1_SumOfAngles' } true false false 0.02373 {1×1 struct} {'rightTriTolTest/Test2_IsoscelesTriangles' } true false false 0.0047332 {1×1 struct} {'rightTriTolTest/Test3_30_60_90Triangle' } true false false 0.0051982 {1×1 struct} {'rightTriTolTest/Test4_SmallAngleApproximation'} true false false 0.0049869 {1×1 struct}