В этом примере показано, как создать тест, который параметрируется в TestClassSetup, TestMethodSetup, и Test
methods блоки. Тестовый класс в качестве примера тестирует генерацию случайных чисел.
В файле в вашей текущей папке создайте 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 для генератора случайных чисел, и параметризация тестового уровня задает тип данных и размер случайных значений.
Задайте методы настройки на тестовых уровнях метода класса и метода тестирования. Эти методы указывают начальное состояние генератора случайных чисел. После того, как среда запускает тесты, методы восстанавливают исходное состояние. 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 параметризация, среда вызывает testRepeatble метод 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 __________
matlab.unittest.selectors.HasParameter | matlab.unittest.TestCase | matlab.unittest.TestSuite