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

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

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

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

type свойство содержит различные типы данных, которые вы хотите протестировать. level свойство содержит различные фрактальные уровни, которые вы хотите протестировать. side свойство содержит количество строк и столбцов в матрице ковра Серпинскего и соответствует 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.

Запустите Тесты со Свойством уровня, Названным 'маленьким'

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

Смотрите также

| |

Похожие темы