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

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

Создайте функцию 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 функция. Тестовый скрипт должен соответствовать следующим соглашениям:

  • Имя тестового файла должно начинаться или заканчиваться словом 'test', которое не учитывает регистр. Если имя файла не начинается или заканчивается словом '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. The runtests функция выполняет каждый тест в каждой секции кода индивидуально. Если тест 1 завершается неуспешно, MATLAB все еще запускает оставшиеся тесты. Если вы выполняете rightTriTest как скрипт вместо использования runtestsMATLAB останавливает выполнение всего скрипта, если он сталкивается со сбоем проверки типа «assertion». Кроме того, когда вы запускаете тесты с использованием 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}

См. также

|

Похожие темы