Создайте основной параметризованный тест

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

Создайте функцию для тестирования

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

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

The type свойство содержит различные типы данных, которые необходимо протестировать. The level свойство содержит различные фрактальные уровни, которые вы хотите протестировать. The side свойство содержит количество строк и столбцов в матрице ковра Серпинского и соответствует level свойство. Чтобы предоставить значимые имена для каждого параметра, level и side определяются как структуры.

Определите методы тестирования Блок

В methods блок со Test атрибут, задайте три метода тестирования:

  • The testRemainPixels метод проверяет выход sierpinski функция путем проверки, что количество ненулевых пикселей совпадает с ожидаемым для конкретного уровня. Этот метод использует level свойство и, следовательно, результаты трех тестовых элементов - по одному для каждого значения в level.

  • The testClass метод проверяет класс выхода из sierpinski функция с каждой комбинацией type и level значения параметров (то есть исчерпывающая комбинация параметров). Метод приводит к девяти тестовым элементам.

  • The 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'));

См. также

| |

Похожие темы