Этот пример показывает, как создать основной параметризованный тест.
Определение Блока Методов тестирования с Атрибутом ParameterCombination
Запущение Тестов со Свойством Параметра уровня, Названным маленьким
В вашей рабочей папке создайте функцию в файле sierpinski.m 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);
endСвойство type содержит различные типы данных, которые вы хотите протестировать. Свойство 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
endМетод testRemainPixels тестирует вывод функции 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 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. Testsuite. selectIf | matlab.unittest.selectors. HasParameter