В этом примере показано, как создать основной параметрированный тест.
Определение Блока Методов тестирования с Атрибутом ParameterCombination
Запущение Тестов со Свойством Параметра уровня, Названным маленьким
В вашей рабочей папке создайте функцию в файле sierpinski.m. Эта функция возвращает матрицу, представляющую изображение фрактала ковра Серпинскего. Это берет в качестве входа фрактальный уровень и тип дополнительных данных.
function carpet = sierpinski(nLevels,classname) if nargin == 1 classname = 'single'; end mSize = 3^nLevels; carpet = ones(mSize,classname); cutCarpet(1,1,mSize,nLevels) % 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 функция.
classdef TestCarpet < matlab.unittest.TestCaseЗадайте свойства, используемые в параметрированном тестировании. В TestCarpet класс, задайте эти свойства в блоке свойства с TestParameter атрибут.
properties (TestParameter)
type = {'single','double','uint16'};
level = struct('small', 2,'medium', 4, 'large', 6);
side = struct('small', 9, 'medium', 81,'large', 729);
endtype свойство содержит различные типы данных, которые вы хотите протестировать. level свойство содержит различный фрактальный уровень, который вы хотите протестировать. side свойство содержит количество строк и столбцов в матрице ковра Серпинскего и соответствует level свойство. Обеспечить понятные имена для каждого значения параметризации, level и side заданы как структуры.
Задайте следующие методы тестирования в TestCarpet класс.
methods (Test)
function testRemainPixels(testCase, level)
% expected number pixels equal to 1
expPixelCount = 8^level;
% actual number pixels equal to 1
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
endtestRemainPixels метод тестирует выход sierpinski функция путем проверки, что количество ненулевых пикселей эквивалентно ожидаемый для конкретного уровня. Этот метод использует level свойство и, поэтому, результаты в трех тестовых элементах — один для каждого значения в level. testClass метод тестирует класс выхода от sierpinski функция с каждой комбинацией type и level свойства. Этот подход приводит к девяти тестовым элементам. testDefaultL1Output метод тестирования не использует TestParameter свойство и, поэтому, не параметрируется. Этот метод тестирования проверяет, что матрица уровня 1 содержит ожидаемые значения. Поскольку метод тестирования не параметрируется, он приводит к одному тестовому элементу.
В методах тестирования выше, вы не задавали ParameterCombination атрибут Test блок методов. Этим атрибутом является, по умолчанию, 'exhaustive'. Среда тестирования вызывает данный метод тестирования однажды для каждой комбинации тестовых параметров.
Задайте следующие методы тестирования в TestCarpet класс, чтобы гарантировать, что матрица, выведенная sierpinski функция имеет правильное число элементов. Установите ParameterCombination припишите 'sequential'.
methods (Test, ParameterCombination='sequential') function testNumel(testCase, level, side) import matlab.unittest.constraints.HasElementCount testCase.verifyThat(sierpinski(level),... HasElementCount(side^2)) end end end
Методы тестирования с ParameterCombination припишите набор 'sequential' вызываются однажды для каждого соответствующего значения параметра. Свойства, level и side, должен иметь то же количество значений. Начиная с этих свойств у каждого есть три значения, testNumel метод вызывается три раза.
Полное содержимое TestCarpet.m следует.
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) % expected number pixels equal to 1 expPixelCount = 8^level; % actual number pixels equal to 1 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.
suite = matlab.unittest.TestSuite.fromFile('TestCarpet.m');
{suite.Name}'ans =
'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'Комплект имел 16 тестовых элементов. Name элемента указывает на любую параметризацию.
suite.run;
Running TestCarpet .......... ...... Done TestCarpet __________
Используйте selectIf метод TestSuite выбрать тестовые элементы, которые используют конкретную параметризацию. Выберите все тестовые элементы, которые используют название параметра small в level список свойств параметра.
s1 = suite.selectIf('ParameterName','small'); {s1.Name}'
ans =
'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.TestCase | matlab.unittest.selectors.HasParameter | selectIf