Этот пример показывает, как создать основной параметризованный тест.
Определение Блока Методов тестирования с Атрибутом 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