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