В этом примере показано, как создать тест, который параметрируется в TestClassSetup, TestMethodSetup, и Test
methods блоки. Тестовый класс в качестве примера тестирует генератор случайных чисел.
TestRand тестовый класс параметрируется на трех разных уровнях.
| Уровень параметризации | Определение параметризации | Доступные свойства параметризации | |
|---|---|---|---|
| Атрибут метода | Атрибут свойства | ||
| Протестируйте уровень | Test | TestParameter | TestParameter, MethodSetupParameter, и ClassSetupParameter |
| Уровень настройки метода | TestMethodSetup | MethodSetupParameter | MethodSetupParameter и ClassSetupParameter |
| Уровень настройки класса | TestClassSetup | ClassSetupParameter | ClassSetupParameter |
На каждом тестовом уровне можно использовать ParameterCombination атрибут метода, чтобы задать тестовую параметризацию.
ParameterCombination Атрибут | Вызов метода |
|---|---|
'exhaustive' (значение по умолчанию) | Методы вызываются для всех комбинаций параметров. Среда тестирования использует эту комбинацию по умолчанию, если вы не задаете ParameterCombination атрибут. |
'sequential' | Методы вызываются с соответствующими значениями от каждого параметра. Каждый параметр должен содержать то же количество значений. |
'pairwise' | Методы вызываются для каждой пары значений параметров, по крайней мере, однажды. В то время как среда тестирования гарантирует, что тесты создаются для каждой пары значений, по крайней мере, однажды, вы не должны использовать тот размер, упорядоченное расположение или определенный набор элементов тестового набора. |
Например, используйте объединенный атрибут методов TestMethodSetup, ParameterCombination='sequential' задавать последовательную комбинацию параметров уровня настройки метода, заданных в MethodSetupParameter блок свойств.
В данном примере параметризация уровня настройки класса задает тип генератора случайных чисел. Параметризация уровня настройки метода задает seed для генератора случайных чисел, и параметризация тестового уровня задает тип данных и размер случайного числа выход.
В файле в вашей рабочей папке создайте класс, который наследовался matlab.unittest.TestCase. Этот класс тестирует различные аспекты генерации случайных чисел.
classdef TestRand < matlab.unittest.TestCaseЗадайте свойства, используемые в параметрированном тестировании. Каждый properties блок соответствует параметризации на конкретном уровне.
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Задайте методы настройки на тестовом уровне метода класса и метода тестирования. Эти методы указывают начальное состояние генератора случайных чисел. После того, как среда запускает тесты, методы восстанавливают исходное состояние. ClassSetup метод задает тип генератора случайных чисел и TestMethodSetup отбирает генератор.
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' атрибуты. Среда тестирования вызывает эти методы однажды для каждого соответствующего значения свойства.
methods (Test, ParameterCombination='sequential') function testSize(testCase,dim1,dim2,dim3) testCase.verifySize(rand(dim1,dim2,dim3),[dim1 dim2 dim3]) end end
Метод тестирует размер выхода для каждого соответствующего параметра в dim1, dim2, и dim3. Например, чтобы протестировать весь 'medium' использование значений: testCase.verifySize(rand(2,3,4),[2 3 4]);. Для данного TestClassSetup и TestMethodSetup параметризация, среда вызывает testSize метод три раза — однажды каждый для 'small', 'medium', и 'large' значения.
Задайте methods блокируйтесь с Test и ParameterCombination='pairwise' атрибуты. Среда тестирования вызывает эти методы, по крайней мере, однажды для каждой пары значений свойств.
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
Метод тестирования проверяет, что результаты генератора случайных чисел повторяемы. Для данного TestClassSetup и TestMethodSetup параметризация, среда вызывает testRepeatble метод 10 раз, чтобы гарантировать тестирование каждой пары dim1, dim2, и dim3. Однако, если атрибут комбинации параметра является исчерпывающим, среда вызывает метод 3^3=27 \times.
Задайте methods блокируйтесь с Test припишите или никакая заданная комбинация параметра. Комбинация параметра является исчерпывающей по умолчанию. Среда тестирования вызывает эти методы однажды для каждой комбинации значений свойств.
methods (Test)
function testClass(testCase,dim1,dim2,type)
testCase.verifyClass(rand(dim1,dim2,type), type)
end
endМетод тестирования проверяет что класс выхода от rand совпадает с ожидаемым классом. Для данного TestClassSetup и TestMethodSetup параметризация, среда вызывает testClass метод 3*3*2=18 времена, чтобы гарантировать тестирование каждой комбинации dim1, dim2, и type.
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
В командной строке создайте комплект из TestRand.m класс.
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.Тестовый набор содержит 279 тестовых элементов. Для данного 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 свойство как struct с более описательными именами полей.
В командной строке создайте селектор, чтобы выбрать тестовые элементы, которые тестируют '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.Если вы сначала генерируете полный комплект, создайте тот же тестовый набор как выше использования 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.m то использование название параметра 'double'.
runtests('TestRand','ParameterName','double');
Running TestRand .......... .......... .......... .......... .......... .......... .......... .......... . Done TestRand __________
matlab.unittest.TestCase | matlab.unittest.TestSuite | matlab.unittest.selectors