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