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

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

Тестирование обзора

TestRand тестовый класс параметрируется на трех разных уровнях.

Уровень параметризацииОпределение параметризацииДоступные свойства параметризации
Атрибут методаАтрибут свойства
Протестируйте уровеньTestTestParameterTestParameter, MethodSetupParameter, и ClassSetupParameter
Уровень настройки методаTestMethodSetupMethodSetupParameterMethodSetupParameter и ClassSetupParameter
Уровень настройки классаTestClassSetupClassSetupParameterClassSetupParameter

На каждом тестовом уровне можно использовать ParameterCombination атрибут метода, чтобы задать тестовую параметризацию.

ParameterCombination АтрибутВызов метода
'exhaustive' (значение по умолчанию)Методы вызываются для всех комбинаций параметров. Среда тестирования использует эту комбинацию по умолчанию, если вы не задаете ParameterCombination атрибут.
'sequential'Методы вызываются с соответствующими значениями от каждого параметра. Каждый параметр должен содержать то же количество значений.
'pairwise'Методы вызываются для каждой пары значений параметров, по крайней мере, однажды. В то время как среда тестирования гарантирует, что тесты создаются для каждой пары значений, по крайней мере, однажды, вы не должны использовать тот размер, упорядоченное расположение или определенный набор элементов тестового набора.

Например, используйте объединенный атрибут методов TestMethodSetup, ParameterCombination='sequential' задавать последовательную комбинацию параметров уровня настройки метода, заданных в MethodSetupParameter блок свойств.

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

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

В файле в вашей рабочей папке создайте класс, который наследовался matlab.unittest.TestCase. Этот класс тестирует различные аспекты генерации случайных чисел.

classdef TestRand < matlab.unittest.TestCase

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

Задайте свойства, используемые в параметрированном тестировании. Каждый properties блок соответствует параметризации на конкретном уровне.

    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

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

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

    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' атрибуты. Среда тестирования вызывает эти методы однажды для каждого соответствующего значения свойства.

    methods (Test, ParameterCombination='sequential')
        function testSize(testCase,dim1,dim2,dim3)
            testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3])
        end 
    end

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

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

Задайте methods блокируйтесь с Test и ParameterCombination='pairwise' атрибуты. Среда тестирования вызывает эти методы, по крайней мере, однажды для каждой пары значений свойств.

    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

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

Определение исчерпывающих параметризованных методов тестирования

Задайте methods блокируйтесь с Test припишите или никакая заданная комбинация параметра. Комбинация параметра является исчерпывающей по умолчанию. Среда тестирования вызывает эти методы однажды для каждой комбинации значений свойств.

    methods (Test)
        function testClass(testCase,dim1,dim2,type)
            testCase.verifyClass(rand(dim1,dim2,type), type)
        end
    end

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

Сводные данные определения класса 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
    
    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

Создание комплекта из всех тестов

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

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.

Тестовый набор содержит 279 тестовых элементов. Для данного 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 свойство как struct с более описательными именами полей.

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

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

Если вы сначала генерируете полный комплект, создайте тот же тестовый набор как выше использования 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.m то использование название параметра 'double'.

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

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

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте