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

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

Создание функции 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. Каждый модульный тест проверяет различный выход 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

Выполните 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}

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

|

Похожие темы