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