Этот пример показывает, как записать скрипт, который тестирует функцию, которую вы создаете. Функция, взятая в качестве примера, вычисляет углы прямоугольного треугольника, и вы создаете модульный тест на основе скриптов, чтобы протестировать функцию.
Создайте эту функцию в файле, 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
. Тестовый скрипт должен соответствовать следующим соглашениям:
Имя файла скрипта должно запустить или закончить словом 'test'
, который является нечувствительным к регистру.
Поместите каждый модульный тест в отдельный участок файла скрипта. Каждый раздел начинается с двух знаков процента (%%
) и текст, который следует, та же строка становится именем тестового элемента. Если никакой текст не следует за %%
, 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 = 4x6 table Name Passed Failed Incomplete Duration Details _______________________________________________ ______ ______ __________ ________ ____________ 'rightTriTolTest/Test1_SumOfAngles' true false false 0.039437 [1x1 struct] 'rightTriTolTest/Test2_IsoscelesTriangles' true false false 0.006934 [1x1 struct] 'rightTriTolTest/Test3_30_60_90Triangle' true false false 0.007408 [1x1 struct] 'rightTriTolTest/Test4_SmallAngleApproximation' true false false 0.007197 [1x1 struct]