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