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

В этом примере показано, как создать тест, который параметризован в 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 тестового класса и тестового метода

Определите методы настройки на уровнях класса тестирования и метода тестирования. Эти методы регистрируют начальное состояние генератора случайных чисел. После того, как среда запустит тесты, методы восстановят исходное состояние. The 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', 'medium', и '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' имя параметра.

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' имя параметра.

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

См. также

| |

Похожие темы