exponenta event banner

Создание базового параметризованного теста

В этом примере показано, как создать параметризованный тест для проверки выходных данных функции с точки зрения значения, класса и размера.

Создание тестируемой функции

В текущей папке создайте функцию в файле 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

Создать класс тестирования «» Test Carpet

В файле в текущей папке создайте 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

Определение блока методов тестирования с атрибутом ParameterCombination

Определите 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.

Выполнить тесты со свойством уровня «» small

Используйте 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'));

См. также

| |

Связанные темы