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