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