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