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

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

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

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

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

| |

Похожие темы