В этом примере показано, как записать скриптовый тест, в котором в качестве вспомогательных функций используются локальные функции. Функция примера аппроксимирует синус и косинус угла. Тест на основе сценария проверяет аппроксимацию с помощью локальных функций для проверки равенства в пределах допуска.
approxSinCos Функция для тестированияСоздайте эту функцию в файле, approxSinCos.m, в текущей папке MATLAB. Эта функция принимает угол в радианах и аппроксимирует синус и косинус угла с помощью ряда Тейлора.
function [sinA,cosA] = approxSinCos(x) % For a given angle in radians, approximate the sine and cosine of the angle % using Taylor series. sinA = x; cosA = 1; altSign = -1; for n = 3:2:26 sinA = sinA + altSign*(x^n)/factorial(n); cosA = cosA + altSign*(x^(n-1))/factorial(n-1); altSign = -altSign; end
В текущей папке MATLAB создайте новый сценарий, approxSinCosTest.m.
Примечание.Для включения функций в сценарии требуется MATLAB ® R2016b или более поздней версии.
%% Test 0rad % Test expected values of 0 [sinApprox,cosApprox] = approxSinCos(0); assertWithAbsTol(sinApprox,0) assertWithRelTol(cosApprox,1) %% Test 2pi % Test expected values of 2pi [sinApprox,cosApprox] = approxSinCos(2*pi); assertWithAbsTol(sinApprox,0) assertWithRelTol(cosApprox,1) %% Test pi over 4 equality % Test sine and cosine of pi/4 are equal [sinApprox,cosApprox] = approxSinCos(pi/4); assertWithRelTol(sinApprox,cosApprox,'sine and cosine should be equal') %% Test matches MATLAB fcn % Test values of 2pi/3 match MATLAB output for the sin and cos functions x = 2*pi/3; [sinApprox,cosApprox] = approxSinCos(x); assertWithRelTol(sinApprox,sin(x),'sin does not match') assertWithRelTol(cosApprox,cos(x),'cos does not match') function assertWithAbsTol(actVal,expVal,varargin) % Helper function to assert equality within an absolute tolerance. % Takes two values and an optional message and compares % them within an absolute tolerance of 1e-6. tol = 1e-6; tf = abs(actVal-expVal) <= tol; assert(tf, varargin{:}); end function assertWithRelTol(actVal,expVal,varargin) % Helper function to assert equality within a relative tolerance. % Takes two values and an optional message and compares % them within a relative tolerance of 0.1%. relTol = 0.001; tf = abs(expVal - actVal) <= relTol.*abs(expVal); assert(tf, varargin{:}); end
Каждый единичный тест использует assert для проверки различных выходов approxSinCos функция. Обычно при сравнении значений с плавающей запятой задается допуск для сравнения. Локальные функции assertWithAbsTol и assertWithRelTol - вспомогательные функции для вычисления того, равны ли фактические и ожидаемые значения в пределах указанного абсолютного или относительного допуска.
Test 0rad проверяет, находятся ли вычисленные и ожидаемые значения для угла 0 радиан в пределах абсолютного допуска 1e-6 или относительный допуск 0,1%. Обычно для сравнения значений, близких к 0, используется абсолютный допуск.
Test 2pi проверяет
, равны ли вычисленные и ожидаемые значения для угла радиан в пределах абсолютного допуска 1e-6 или относительный допуск 0,1%.
Test pi over 4 equality проверяет
, равны ли синус и косинус в пределах относительного допуска 0,1%.
Test matches MATLAB fcn проверяет
, равны ли вычисленные синус и косинус sin и cos функции в пределах относительного допуска 0,1%.
Выполните команду runtests для выполнения четырех тестов в approxSinCosTest.m. runtests выполняет каждый тест по отдельности. Если один тест завершается неуспешно, MATLAB по-прежнему выполняет оставшиеся тесты. При выполнении approxSinCosTest в качестве сценария вместо использования runtestsMATLAB останавливает выполнение всего сценария, если он сталкивается с неуспешным утверждением. Кроме того, при выполнении тестов с помощью runtests функция MATLAB обеспечивает информационную диагностику тестов.
results = runtests('approxSinCosTest');
Running approxSinCosTest .... Done approxSinCosTest __________
Все тесты проходят.
Создайте таблицу результатов теста.
rt = table(results)
rt =
4x6 table
Name Passed Failed Incomplete Duration Details
_________________________________________ ______ ______ __________ ________ ____________
{'approxSinCosTest/Test0rad' } true false false 0.30835 {1x1 struct}
{'approxSinCosTest/Test2pi' } true false false 0.019019 {1x1 struct}
{'approxSinCosTest/TestPiOver4Equality' } true false false 0.020224 {1x1 struct}
{'approxSinCosTest/TestMatchesMATLABFcn'} true false false 0.034992 {1x1 struct}