В этом примере показано, как создать тест, который параметризован в 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 для генератора случайных чисел, а параметризация уровня тестирования определяет тип данных и размер случайных значений.
Определите методы настройки на уровнях класса тестирования и метода тестирования. Эти методы регистрируют начальное состояние генератора случайных чисел. После того, как среда запустит тесты, методы восстановят исходное состояние. 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 __________
matlab.unittest.selectors.HasParameter | matlab.unittest.TestCase | matlab.unittest.TestSuite