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