Параметризованные тесты позволяют вам запускать одну и ту же процедуру тестирования неоднократно, каждый раз используя различные значения данных. В параметризованном тесте эти значения данных называются параметрами и представлены свойствами параметризации тестового класса. MATLAB ® использует свойства параметризации, чтобы сгенерировать названия и значения параметра для каждого тестового запуска.
В большинстве случаев MATLAB может определить значение свойства параметризации, когда загружает определение тестового класса. Поэтому можно инициализировать свойство с помощью значения по умолчанию. Когда вы инициализируете свойство параметризации со значением по умолчанию, параметры, связанные со свойством, остаются фиксированными для различных тестовых запусков. Каждый раз, когда вы создаете набор из параметризованного тестового класса, среда тестирования использует одинаковые названия и значения параметра, чтобы запустить тесты.
В некоторых случаях MATLAB не может определить значение свойства параметризации, когда оно загружает определение тестового класса. Для примера иногда свойство параметризации зависит от другого свойства, заданного на более высоком уровне параметризации. Или вы, возможно, не хотите, чтобы параметры определялись во время загрузки класса. Например, если параметры представляют файлы в папке, можно хотеть обновлять параметры каждый раз, когда вы создаете набор, чтобы протестировать файлы. Когда вы не можете или не хотите инициализировать свойство параметризации во время загрузки класса, инициализируйте его во время создания набора с помощью статического метода с TestParameterDefinition
атрибут. Когда вы инициализируете свойство параметризации с помощью TestParameterDefinition
метод, параметры, сопоставленные со свойством, могут варьироваться для различных тестовых запусков. Другими словами, каждый раз, когда вы создаете тестовый набор из параметризованного тестового класса, среда генерирует новые названия и значения параметра для запуска тестов.
В этом примере показано, как использовать свойства параметризации с значениями по умолчанию и без значений по умолчанию, чтобы убедиться, что общественная собственность группы классов в текущей папке непусты. В нем вы задаете параметризованный тестовый класс с именем PropertiesTest
в test
подпапка текущей папки. Вы задаете три класса для тестирования, имя ClassA
, ClassB
, и ClassC
, в source
подпапка текущей папки. Для получения сводных данных из этих трех классов смотрите Классы в исходной Подпапке.
Чтобы протестировать общественную собственность классов, определенных в source
подпапка, создайте PropertiesTest
класс в test
подпапка. Этот класс принимает три заданных класса, извлекает все свойства каждого класса и проверяет, что они непусты. Чтобы выполнить итерацию над тестируемыми классами, параметризируйте PropertiesTest
на уровне настройки класса. Чтобы выполнить итерацию по свойствам каждого класса, заданным заданной параметризацией уровня настройки класса, параметризируйте PropertiesTest
на тестовом уровне.
Задайте свойства, используемые для параметризованной проверки:
Перечислите классы для итерации среды в свойстве с именем ClassToTest
. Потому что этот пример принимает, что классы в source
подпапка фиксирована и известна во время загрузки MATLAB определения тестового класса, инициализируйте свойство с помощью значения по умолчанию. В порядок задать класс для тестирования перед запуском любого Test
методы, сделать ClassToTest
a ClassSetupParameter
свойство.
Задайте TestParameter
свойство с именем PropertyToTest
который можно использовать для итерации свойств любого класса, тестируемого в настоящее время в среде. Поскольку его значение зависит от тестируемого класса, не присваивайте ему значение по умолчанию. Вместо этого инициализируйте его во время создания набора с помощью TestParameterDefinition
способ.
Чтобы хранить значения различных свойств на образце тестируемого класса, задайте свойство с именем ObjectToTest
.
classdef PropertiesTest < matlab.unittest.TestCase properties (ClassSetupParameter) ClassToTest = {'ClassA', 'ClassB', 'ClassC'}; end properties (TestParameter) PropertyToTest end properties ObjectToTest end end
В PropertiesTest
класс, PropertyToTest
имеет разное значение для каждого тестируемого класса. Поэтому вы не можете назначить ему значение по умолчанию. Вместо этого необходимо инициализировать его во время создания набора. Чтобы реализовать это требование, добавьте TestParameterDefinition
метод с именем initializeProperty
. Потому что TestParameterDefinition
метод должен быть статическим, использовать объединенные атрибуты метода TestParameterDefinition, Static
для определения метода.
The initializeProperty
метод принимает свойство параметризации уровня настройки класса как вход и использует его в вызове properties
функция для возврата имен свойства в массив ячеек из векторов символов.
classdef PropertiesTest < matlab.unittest.TestCase properties (ClassSetupParameter) ClassToTest = {'ClassA', 'ClassB', 'ClassC'}; end properties (TestParameter) PropertyToTest end properties ObjectToTest end methods (TestParameterDefinition, Static) function PropertyToTest = initializeProperty(ClassToTest) PropertyToTest = properties(ClassToTest); end end end
В initializeProperty
метод, оба входных параметра ClassToTest
и выходной аргумент PropertyToTest
являются свойствами параметризации, заданными в PropertiesTest
класс. Каждый раз, когда вы задаете TestParameterDefinition
метод, все входы метода совпадают со свойствами параметризации, заданными в том же классе или в одном из его суперклассов. Кроме того, все выходы метода должны совпадать со свойствами параметризации, заданными в том же классе.
В initializeProperty
метод, входной параметр ClassToTest
определяется на самом высоком уровне параметризации. Это ставит его выше выходного аргумента PropertyToTest
, который определяется на самом низком уровне параметризации. Каждый раз, когда вы задаете TestParameterDefinition
метод, который принимает входы, входы должны быть на более высоком уровне параметризации относительно выходов метода. Для получения дополнительной информации об уровнях параметризации смотрите Использование параметров в основанных на классах тестах.
Чтобы проверить на непустые значения свойств, необходимо сначала создать объект тестируемого класса, чтобы можно было получить значения свойств. Чтобы реализовать это требование, добавьте параметризованную classSetup
метод к PropertiesTest
класс. Порядок объект был готов перед запуском любого Test
методы, сделать c lassSetup
a TestClassSetup
способ.
The classSetup
метод создает образец тестируемого класса и сохраняет его в ObjectToTest
свойство. Тесты могут позже извлечь значения свойств из ObjectToTest
. В этом примере среда запускает тесты, вызывая classSetup
метод три раза - по одному времени для каждого из ClassA
, ClassB
, и ClassC
.
classdef PropertiesTest < matlab.unittest.TestCase properties (ClassSetupParameter) ClassToTest = {'ClassA', 'ClassB', 'ClassC'}; end properties (TestParameter) PropertyToTest end properties ObjectToTest end methods (TestParameterDefinition, Static) function PropertyToTest = initializeProperty(ClassToTest) PropertyToTest = properties(ClassToTest); end end methods (TestClassSetup) function classSetup(testCase,ClassToTest) constructor = str2func(ClassToTest); testCase.ObjectToTest = constructor(); end end end
Чтобы проверить, что свойства на ObjectToTest
непусты, добавить Test
метод с именем testProperty
. В порядок для метода, чтобы итерация по свойствам ObjectToTest
, сделайте метод параметризованным и передайте его PropertyToTest
.
Во время каждого теста testProperty
метод извлекает значение свойства на ObjectToTest
. Затем он использует вызов к verifyNotEmpty
метод проверки, чтобы убедиться, что значение не пустое. Для заданной параметризации уровня настройки классов среда вызывает testProperty
один раз для каждого свойства в тестируемом классе.
classdef PropertiesTest < matlab.unittest.TestCase properties (ClassSetupParameter) ClassToTest = {'ClassA', 'ClassB', 'ClassC'}; end properties (TestParameter) PropertyToTest end properties ObjectToTest end methods (TestParameterDefinition, Static) function PropertyToTest = initializeProperty(ClassToTest) PropertyToTest = properties(ClassToTest); end end methods (TestClassSetup) function classSetup(testCase,ClassToTest) constructor = str2func(ClassToTest); testCase.ObjectToTest = constructor(); end end methods (Test) function testProperty(testCase,PropertyToTest) value = testCase.ObjectToTest.(PropertyToTest); testCase.verifyNotEmpty(value) end end end
Теперь, когда PropertiesTest
определение класса завершено, можно создать параметризованный тестовый набор и запустить тесты. Для этого убедитесь, что source
и test
подпапки указаны в пути.
addpath('source','test')
Создайте набор из PropertiesTest
класс.
suite = testsuite('PropertiesTest');
Тестовый набор включает восемь элементов. Каждый элемент соответствует свойству, заданному в source
подпапка. Возвращает имя первого элемента набора.
suite(1).Name
ans = 'PropertiesTest[ClassToTest=ClassA]/testProperty(PropertyToTest=PropA1)'
Имя первого элемента состоит из следующих частей:
PropertiesTest
- Имя тестового класса
[ClassToTest=ClassA]
- Свойство Class-setup-level и имя параметра
testProperty
— Test
имя метода
(PropertyToTest=PropA1)
- Свойство тестового уровня и имя параметра
Запустите тесты. Потому что два свойства в source
подпапка пуста, два теста завершаются неуспешно.
suite.run
Running PropertiesTest .. ================================================================================ Verification failed in PropertiesTest[ClassToTest=ClassA]/testProperty(PropertyToTest=PropA3). --------------------- Framework Diagnostic: --------------------- verifyNotEmpty failed. --> The value must not be empty. --> The value has a size of [0 0]. Actual Value: [] ------------------ Stack Information: ------------------ In C:\TEMP\Examples\matlab-ex41465327\test\PropertiesTest.m (PropertiesTest.testProperty) at 30 ================================================================================ .... ================================================================================ Verification failed in PropertiesTest[ClassToTest=ClassC]/testProperty(PropertyToTest=PropC1). --------------------- Framework Diagnostic: --------------------- verifyNotEmpty failed. --> The value must not be empty. --> The value has a size of [0 0]. Actual Value: [] ------------------ Stack Information: ------------------ In C:\TEMP\Examples\matlab-ex41465327\test\PropertiesTest.m (PropertiesTest.testProperty) at 30 ================================================================================ .. Done PropertiesTest __________ Failure Summary: Name Failed Incomplete Reason(s) ===================================================================================================================== PropertiesTest[ClassToTest=ClassA]/testProperty(PropertyToTest=PropA3) X Failed by verification. --------------------------------------------------------------------------------------------------------------------- PropertiesTest[ClassToTest=ClassC]/testProperty(PropertyToTest=PropC1) X Failed by verification.
ans = 1×8 TestResult array with properties: Name Passed Failed Incomplete Duration Details Totals: 6 Passed, 2 Failed (rerun), 0 Incomplete. 2.9493 seconds testing time.
Запускайте только тесты для ClassB
. Для этого используйте selectIf
метод matlab.unittest.TestSuite
Класс, чтобы выбрать элементы тестового набора, которые используют конкретную параметризацию. Получившийся тестовый набор представляет собой отфильтрованный набор и имеет только три элемента.
suite2 = suite.selectIf('ParameterName','PropB*'); {suite2.Name}'
ans = 3×1 cell
{'PropertiesTest[ClassToTest=ClassB]/testProperty(PropertyToTest=PropB1)'}
{'PropertiesTest[ClassToTest=ClassB]/testProperty(PropertyToTest=PropB2)'}
{'PropertiesTest[ClassToTest=ClassB]/testProperty(PropertyToTest=PropB3)'}
Запустите отфильтрованный набор.
suite2.run;
Running PropertiesTest ... Done PropertiesTest __________
Также можно запустить те же тесты, создав селектор, который фильтрует тестовый набор по параметризации.
import matlab.unittest.selectors.HasParameter import matlab.unittest.constraints.StartsWithSubstring suite3 = matlab.unittest.TestSuite.fromClass(?PropertiesTest, ... HasParameter('Name',StartsWithSubstring('PropB'))); suite3.run;
Running PropertiesTest ... Done PropertiesTest __________
В этом разделе приводится содержимое классов в source
подпапка.
ClassA
имеет три свойства. Два его свойства имеют непустые значения.
classdef ClassA properties PropA1 = 1; PropA2 = 2; PropA3 end end
ClassB
имеет три свойства. Все его свойства имеют непустые значения.
classdef ClassB properties PropB1 = 1; PropB2 = 2; PropB3 = 'a'; end end
ClassC
имеет два свойства. Одно из его свойств имеет непустое значение.
classdef ClassC properties PropC1 PropC2 = [1 2 3]; end end
matlab.unittest.selectors.HasParameter
| matlab.unittest.TestCase
| matlab.unittest.TestSuite