Запись модульных тестов на основе скриптов

Этот пример показывает, как записать скрипт, который тестирует функцию, которую вы создаете. Функция, взятая в качестве примера, вычисляет углы прямоугольного треугольника, и вы создаете модульный тест на основе скриптов, чтобы протестировать функцию.

Создание функции rightTri, чтобы Протестировать

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

Выполните функцию runtests, чтобы запустить эти четыре теста в rightTriTest.m 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.042824    [1x1 struct]
    'rightTriTolTest/Test2_IsoscelesTriangles'         true      false       false       0.007496    [1x1 struct]
    'rightTriTolTest/Test3_30_60_90Triangle'           true      false       false       0.007654    [1x1 struct]
    'rightTriTolTest/Test4_SmallAngleApproximation'    true      false       false       0.007579    [1x1 struct]

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

|

Похожие темы

Была ли эта тема полезной?