Параметрированные тесты позволяют вам неоднократно запускать ту же процедуру тестирования, с помощью различных значений данных каждый раз. В параметрированном тесте эти значения данных называются параметрами и представлены свойствами параметризации тестового класса. MATLAB® использует свойства параметризации сгенерировать название и значение параметра для каждого тестового прогона.
В большинстве случаев MATLAB может определить значение свойства параметризации, когда это загружает тестовое определение класса. Поэтому можно инициализировать свойство с помощью значения по умолчанию. Когда вы инициализируете свойство параметризации значением по умолчанию, параметры, сопоставленные со свойством, остаются фиксированными для различных тестовых прогонов. Каждый раз, когда вы создаете набор из параметрированного тестового класса, среда тестирования использует то же название и значение параметра, чтобы запустить тесты.
В некоторых случаях MATLAB не может определить значение свойства параметризации, когда это загружает тестовое определение класса. Например, иногда свойство параметризации зависит от другого свойства, заданного на более высоком уровне параметризации. Или вы не можете хотеть, чтобы параметры были определены во время загрузки класса. Например, если параметры представляют файлы в папке, вы можете хотеть обновить параметры каждый раз, когда вы создаете набор, чтобы протестировать файлы. Когда вы не можете или не хотеть инициализировать свойство параметризации во время загрузки класса, инициализировать его во время создания набора с помощью статического метода с TestParameterDefinition
атрибут. Когда вы инициализируете свойство параметризации с помощью TestParameterDefinition
метод, параметры, сопоставленные со свойством, может варьироваться для различных тестовых прогонов. Другими словами, каждый раз, когда вы создаете тестовый набор из параметрированного тестового класса, среда генерирует новое название и значение параметра, чтобы запустить тесты.
В этом примере показано, как использовать свойства параметризации со значениями не по умолчанию и по умолчанию, чтобы проверить, что публичные свойства группы классов в вашей текущей папке непусты. В нем вы задаете параметрированный тестовый класс под названием PropertiesTest
в test
подпапка вашей текущей папки. Вы задаете три класса, чтобы протестировать, названный ClassA
, ClassB
, и ClassC
, в source
подпапка вашей текущей папки. Для сводных данных этих трех классов смотрите Классы в исходной Подпапке.
Протестировать публичные свойства классов, заданных в source
подпапка, создайте PropertiesTest
класс в test
подпапка. Этот класс посещает три заданных урока, получает все свойства каждого класса и проверяет, что они непусты. Чтобы выполнить итерации по классам, чтобы протестировать, параметрируйте PropertiesTest
на уровне настройки класса. Чтобы выполнить итерации по свойствам каждого класса, заданного данной параметризацией уровня настройки класса, параметрируйте PropertiesTest
на тестовом уровне.
Задайте свойства, используемые для параметрированного тестирования:
Перечислите классы для среды, чтобы выполнить итерации в свойстве под названием ClassToTest
. Поскольку этот пример принимает что классы в source
подпапка фиксируется и известна в то время, когда MATLAB загружает тестовое определение класса, инициализируйте свойство с помощью значения по умолчанию. Для того, чтобы задать класс, чтобы протестировать прежде, чем запустить любой Test
методы, сделайте ClassToTest
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
задавать метод.
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
методы, сделайте classSetup
TestClassSetup
метод.
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]
— Имя свойства уровня настройки класса и название параметра
testProperty
Тест
methodName
(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