В этом примере показано, как создать параметризованный тест для проверки выходных данных функции с точки зрения значения, класса и размера.
В текущей папке создайте функцию в файле sierpinski.m. Эта функция возвращает матрицу, представляющую изображение фрактала ковра Серпинского. В качестве входных данных используется фрактальный уровень и дополнительный тип данных.
function carpet = sierpinski(levels,classname) if nargin == 1 classname = 'single'; end msize = 3^levels; carpet = ones(msize,classname); cutCarpet(1,1,msize,levels) % Begin recursion function cutCarpet(x,y,s,cl) if cl ss = s/3; % Define subsize for lx = 0:2 for ly = 0:2 if lx == 1 && ly == 1 % Remove center square carpet(x+ss:x+2*ss-1,y+ss:y+2*ss-1) = 0; else % Recurse cutCarpet(x+lx*ss,y+ly*ss,ss,cl-1) end end end end end end
В файле в текущей папке создайте TestCarpet класс для тестирования sierpinski функция. Определение свойств, используемых для параметризованного тестирования в properties блок с TestParameter атрибут.
classdef TestCarpet < matlab.unittest.TestCase properties (TestParameter) type = {'single','double','uint16'}; level = struct('small',2,'medium',4,'large',6); side = struct('small',9,'medium',81,'large',729); end end
type содержит различные типы данных, которые требуется проверить. level содержит различные фрактальные уровни, которые требуется проверить. side содержит количество строк и столбцов в матрице ковра Sierpinski и соответствует level собственность. Чтобы предоставить значимые имена для каждого параметра, level и side определяются как структуры.
В methods блок с Test , определите три метода тестирования:
testRemainPixels метод проверяет выходные данные sierpinski путем проверки того, что число ненулевых пикселей совпадает с ожидаемым для определенного уровня. Этот метод использует level свойство и, следовательно, результаты в трех тестовых элементах - по одному для каждого значения вlevel.
testClass метод проверяет класс выходных данных sierpinski с каждой комбинацией type и level значения параметров (то есть исчерпывающая комбинация параметров). Способ дает девять тестовых элементов.
testDefaultL1Output метод не использует TestParameter свойство и, следовательно, не параметризовано. Метод проверяет, что матрица уровня 1 содержит ожидаемые значения. Поскольку метод тестирования не параметризован, он приводит к созданию одного тестового элемента.
classdef TestCarpet < matlab.unittest.TestCase properties (TestParameter) type = {'single','double','uint16'}; level = struct('small',2,'medium',4,'large',6); side = struct('small',9,'medium',81,'large',729); end methods (Test) function testRemainPixels(testCase,level) expPixelCount = 8^level; actPixels = find(sierpinski(level)); testCase.verifyNumElements(actPixels,expPixelCount) end function testClass(testCase,type,level) testCase.verifyClass( ... sierpinski(level,type),type) end function testDefaultL1Output(testCase) exp = single([1 1 1; 1 0 1; 1 1 1]); testCase.verifyEqual(sierpinski(1),exp) end end end
Определите testNumel чтобы гарантировать, что матрица возвращается sierpinski имеет правильное количество элементов. Установите ParameterCombination атрибут метода для 'sequential'. Потому что level и side свойства каждый задают три значения параметра, testNumel метод вызывается три раза - один раз для каждого из 'small', 'medium', и 'large' значения.
classdef TestCarpet < matlab.unittest.TestCase properties (TestParameter) type = {'single','double','uint16'}; level = struct('small',2,'medium',4,'large',6); side = struct('small',9,'medium',81,'large',729); end methods (Test) function testRemainPixels(testCase,level) expPixelCount = 8^level; actPixels = find(sierpinski(level)); testCase.verifyNumElements(actPixels,expPixelCount) end function testClass(testCase,type,level) testCase.verifyClass( ... sierpinski(level,type),type) end function testDefaultL1Output(testCase) exp = single([1 1 1; 1 0 1; 1 1 1]); testCase.verifyEqual(sierpinski(1),exp) end end methods (Test, ParameterCombination = 'sequential') function testNumel(testCase,level,side) import matlab.unittest.constraints.HasElementCount testCase.verifyThat(sierpinski(level), ... HasElementCount(side^2)) end end end
В командной строке создайте набор из TestCarpet.m. В комплекте 16 тестовых элементов. MATLAB ® включает информацию о параметризации в имена элементов набора.
suite = matlab.unittest.TestSuite.fromFile('TestCarpet.m');
{suite.Name}'
ans =
16×1 cell array
{'TestCarpet/testNumel(level=small,side=small)' }
{'TestCarpet/testNumel(level=medium,side=medium)'}
{'TestCarpet/testNumel(level=large,side=large)' }
{'TestCarpet/testRemainPixels(level=small)' }
{'TestCarpet/testRemainPixels(level=medium)' }
{'TestCarpet/testRemainPixels(level=large)' }
{'TestCarpet/testClass(type=single,level=small)' }
{'TestCarpet/testClass(type=single,level=medium)'}
{'TestCarpet/testClass(type=single,level=large)' }
{'TestCarpet/testClass(type=double,level=small)' }
{'TestCarpet/testClass(type=double,level=medium)'}
{'TestCarpet/testClass(type=double,level=large)' }
{'TestCarpet/testClass(type=uint16,level=small)' }
{'TestCarpet/testClass(type=uint16,level=medium)'}
{'TestCarpet/testClass(type=uint16,level=large)' }
{'TestCarpet/testDefaultL1Output' }
Запустите тесты.
suite.run
Running TestCarpet
.......... ......
Done TestCarpet
__________
ans =
1×16 TestResult array with properties:
Name
Passed
Failed
Incomplete
Duration
Details
Totals:
16 Passed, 0 Failed, 0 Incomplete.
2.459 seconds testing time.
Используйте selectIf способ TestSuite для выбора тестовых элементов, использующих определенную параметризацию. Выберите все тестовые элементы, использующие имя параметра 'small' в level список свойств параметризации. Отфильтрованный набор содержит пять элементов.
s1 = suite.selectIf('ParameterName','small'); {s1.Name}'
ans =
5×1 cell array
{'TestCarpet/testNumel(level=small,side=small)' }
{'TestCarpet/testRemainPixels(level=small)' }
{'TestCarpet/testClass(type=single,level=small)'}
{'TestCarpet/testClass(type=double,level=small)'}
{'TestCarpet/testClass(type=uint16,level=small)'}
Запустите отфильтрованный набор тестов.
s1.run;
Running TestCarpet ..... Done TestCarpet __________
Кроме того, можно создать один и тот же набор тестов непосредственно с помощью fromFile способ TestSuite.
import matlab.unittest.selectors.HasParameter s1 = matlab.unittest.TestSuite.fromFile('TestCarpet.m', ... HasParameter('Name','small'));
matlab.unittest.selectors.HasParameter | matlab.unittest.TestCase | matlab.unittest.TestSuite