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

В этом примере показано, как создать тест, который параметрируется в TestClassSetup, TestMethodSetup, и Test methods блоки. Тестовый класс в качестве примера тестирует генерацию случайных чисел.

Создание тестового класса TestRand

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

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
end

В TestRand класс, каждый properties блок соответствует параметризации на конкретном уровне. Параметризация уровня настройки класса задает тип генератора случайных чисел. Параметризация уровня настройки метода задает seed для генератора случайных чисел, и параметризация тестового уровня задает тип данных и размер случайных значений.

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

Задайте методы настройки на тестовых уровнях метода класса и метода тестирования. Эти методы указывают начальное состояние генератора случайных чисел. После того, как среда запускает тесты, методы восстанавливают исходное состояние. classSetup метод задает тип генератора случайных чисел и methodSetup метод отбирает генератор.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
    
    methods (TestClassSetup)
        function classSetup(testCase,generator)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(0,generator)
        end
    end
    
    methods (TestMethodSetup)
        function methodSetup(testCase,seed)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(seed)
        end
    end
end

Задайте метод тестирования с последовательной комбинацией параметра

Задайте testSize метод в methods блокируйтесь с Test и ParameterCombination = 'sequential' атрибуты.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
    
    methods (TestClassSetup)
        function classSetup(testCase,generator)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(0,generator)
        end
    end
    
    methods (TestMethodSetup)
        function methodSetup(testCase,seed)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(seed)
        end
    end
    
    methods (Test, ParameterCombination = 'sequential')
        function testSize(testCase,dim1,dim2,dim3)
            testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3])
        end
    end
end

Метод тестирует размер выхода для каждого соответствующего значения параметров в dim1, dim2, и dim3. Для данного TestClassSetup и TestMethodSetup параметризация, среда вызывает testSize метод три раза — одно время для каждого 'small'Средняя, и 'large' значения. Например, чтобы протестировать со всем 'medium' значения, среда использует testCase.verifySize(rand(2,3,4),[2 3 4]).

Задайте метод тестирования с попарной комбинацией параметра

Задайте testRepeatable метод в methods блокируйтесь с Test и ParameterCombination = 'pairwise' атрибуты.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
    
    methods (TestClassSetup)
        function classSetup(testCase,generator)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(0,generator)
        end
    end
    
    methods (TestMethodSetup)
        function methodSetup(testCase,seed)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(seed)
        end
    end
    
    methods (Test, ParameterCombination = 'sequential')
        function testSize(testCase,dim1,dim2,dim3)
            testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3])
        end
    end
    
    methods (Test, ParameterCombination = 'pairwise')
        function testRepeatable(testCase,dim1,dim2,dim3)
            state = rng;
            firstRun = rand(dim1,dim2,dim3);
            rng(state)
            secondRun = rand(dim1,dim2,dim3);
            testCase.verifyEqual(firstRun,secondRun)
        end
    end
end

Метод проверяет, что результаты генератора случайных чисел повторяемы. Для данного TestClassSetup и TestMethodSetup параметризация, среда вызывает testRepeatable метод 10 раз, чтобы гарантировать тестирование каждой парой значений параметров, заданных dim1, dim2, и dim3. Если бы комбинация параметра была исчерпывающей, среда вызвала бы метод 3 ³ = 27 раз.

Задайте метод тестирования с исчерпывающей комбинацией параметра

Задайте testClass метод в methods блокируйтесь с Test атрибут. Поскольку ParameterCombination атрибут не задан, комбинация параметра исчерпывающая по умолчанию.

classdef TestRand < matlab.unittest.TestCase
    properties (ClassSetupParameter)
        generator = {'twister','combRecursive','multFibonacci'};
    end
    
    properties (MethodSetupParameter)
        seed = {0,123,4294967295};
    end
    
    properties (TestParameter)
        dim1 = struct('small',1,'medium',2,'large',3);
        dim2 = struct('small',2,'medium',3,'large',4);
        dim3 = struct('small',3,'medium',4,'large',5);
        type = {'single','double'};
    end
    
    methods (TestClassSetup)
        function classSetup(testCase,generator)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(0,generator)
        end
    end
    
    methods (TestMethodSetup)
        function methodSetup(testCase,seed)
            orig = rng;
            testCase.addTeardown(@rng,orig)
            rng(seed)
        end
    end
    
    methods (Test, ParameterCombination = 'sequential')
        function testSize(testCase,dim1,dim2,dim3)
            testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3])
        end
    end
    
    methods (Test, ParameterCombination = 'pairwise')
        function testRepeatable(testCase,dim1,dim2,dim3)
            state = rng;
            firstRun = rand(dim1,dim2,dim3);
            rng(state)
            secondRun = rand(dim1,dim2,dim3);
            testCase.verifyEqual(firstRun,secondRun)
        end
    end
    
    methods (Test)
        function testClass(testCase,dim1,dim2,type)
            testCase.verifyClass(rand(dim1,dim2,type),type)
        end
    end
end

Метод проверяет что класс выхода от rand совпадает с ожидаемым классом. Для данного TestClassSetup и TestMethodSetup параметризация, среда вызывает testClass метод 3×3×2 = 18 раз, чтобы гарантировать тестирование каждой комбинацией dim1, dim2, и type значения параметров.

Создайте набор из тестового класса

В командной строке создайте набор из TestRand класс.

suite = matlab.unittest.TestSuite.fromClass(?TestRand)
suite = 

  1×279 Test array with properties:

    Name
    ProcedureName
    TestClass
    BaseFolder
    Parameterization
    SharedTestFixtures
    Tags

Tests Include:
   17 Unique Parameterizations, 0 Shared Test Fixture Classes, 0 Tags.

Для данного TestClassSetup и TestMethodSetup параметризация, среда создает 3+10+18 = 31 тестовый элемент. Этот 31 элемент называется для каждого TestMethodSetup параметризация (приводящий к 3×31 = 93 тестовых элемента для каждого TestClassSetup параметризация). Существует три TestClassSetup параметризация; поэтому, набор имеет в общей сложности 3×93 = 279 тестовых элементов.

Запросите имя первого тестового элемента.

suite(1).Name
ans =

    'TestRand[generator=twister]/[seed=value1]testClass(dim1=small,dim2=small,type=single)'

Имя первого элемента состоит из этих частей:

  • Тестирование класса: TestRand

  • Имя свойства настройки класса и название параметра: [generator=twister]

  • Имя свойства настройки метода и название параметра: [seed=value1]

  • Имя метода тестирования: testClass

  • Имена свойства метода тестирования и названия параметра: (dim1=small,dim2=small,type=single)

Название параметра для seed свойство не особенно значимо (value1). Среда тестирования обеспечила это имя потому что seed свойство задано как массив ячеек. Для большего количества понятного имени задайте seed свойство как структура с описательными именами полей.

Запустите набор, созданный Используя селектор

В командной строке создайте селектор, чтобы выбрать тестовые элементы, которые тестируют 'twister' генератор для 'single' точность. Создайте набор путем исключения тестовых элементов, которые используют свойства с 'large' 'ParameterName' .

import matlab.unittest.selectors.HasParameter
s = HasParameter('Property','generator','Name','twister') & ...
    HasParameter('Property','type','Name','single') & ...
    ~HasParameter('Name','large');

suite2 = matlab.unittest.TestSuite.fromClass(?TestRand,s)
suite2 = 

  1×12 Test array with properties:

    Name
    ProcedureName
    TestClass
    BaseFolder
    Parameterization
    SharedTestFixtures
    Tags

Tests Include:
   9 Unique Parameterizations, 0 Shared Test Fixture Classes, 0 Tags.

Если вы сначала генерируете полный набор от TestRand класс, можно создать тот же отфильтрованный набор с помощью selectIf метод.

suite = matlab.unittest.TestSuite.fromClass(?TestRand);
suite2 = selectIf(suite,s);

Запустите набор отфильтрованного теста.

suite2.run;
Running TestRand
.......... ..
Done TestRand
__________

Выполнение комплекта из метода Используя селектор

Создайте селектор, который не использует тестовые элементы, которые используют свойства с 'large' или 'medium' названия параметра. Ограничьте результаты протестировать элементы от testRepeatable метод.

import matlab.unittest.selectors.HasParameter
s = ~(HasParameter('Name','large') | HasParameter('Name','medium'));

suite3 = matlab.unittest.TestSuite.fromMethod(?TestRand,'testRepeatable',s);
{suite3.Name}'
ans =

  9×1 cell array

    {'TestRand[generator=twister]/[seed=value1]testRepeatable(dim1=small,dim2=small,dim3=small)'      }
    {'TestRand[generator=twister]/[seed=value2]testRepeatable(dim1=small,dim2=small,dim3=small)'      }
    {'TestRand[generator=twister]/[seed=value3]testRepeatable(dim1=small,dim2=small,dim3=small)'      }
    {'TestRand[generator=combRecursive]/[seed=value1]testRepeatable(dim1=small,dim2=small,dim3=small)'}
    {'TestRand[generator=combRecursive]/[seed=value2]testRepeatable(dim1=small,dim2=small,dim3=small)'}
    {'TestRand[generator=combRecursive]/[seed=value3]testRepeatable(dim1=small,dim2=small,dim3=small)'}
    {'TestRand[generator=multFibonacci]/[seed=value1]testRepeatable(dim1=small,dim2=small,dim3=small)'}
    {'TestRand[generator=multFibonacci]/[seed=value2]testRepeatable(dim1=small,dim2=small,dim3=small)'}
    {'TestRand[generator=multFibonacci]/[seed=value3]testRepeatable(dim1=small,dim2=small,dim3=small)'}

Запустите тестовый набор.

suite3.run;
Running TestRand
.........
Done TestRand
__________

Запущение всех тестов двойной точности

В командной строке запустите все тестовые элементы от TestRand класс, которые используют 'double' 'ParameterName' .

runtests('TestRand','ParameterName','double');
Running TestRand
.......... .......... .......... .......... ..........
.......... .......... .......... .
Done TestRand
__________

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

| |

Похожие темы