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

В этом примере показано, как создать основной параметрированный тест.

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

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

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

classdef TestCarpet < matlab.unittest.TestCase

Определение свойств Block

Задайте свойства, используемые в параметрированном тестировании. В 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'. Среда тестирования вызывает данный метод тестирования однажды для каждой комбинации тестовых параметров.

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

Задайте следующие методы тестирования в 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

Полное содержимое 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.

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

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

| |

Похожие темы