exponenta event banner

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

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

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

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

См. также

| |

Связанные темы