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