Часто нужно запускать серию тестов, отличающихся только с точки зрения тестовых данных. Например, можно проверить, что функция выдает ожидаемые выходные данные для различных входных данных. В этом случае логика тестирования одинакова, и единственным различием между тестами являются фактические и ожидаемые значения для каждого вызова функции. С помощью параметризованного тестирования можно реализовать код для итеративного выполнения тестов с использованием различных значений данных. При параметризации метода структура тестирования автоматически вызывает метод для каждого значения параметра. Поэтому для каждого значения не требуется применять отдельный метод.
Структура тестирования позволяет параметризовать класс тестирования на различных уровнях. Кроме того, при вызове метода класса теста с несколькими параметрами можно указать способ вызова метода для различных комбинаций параметров.
Классы, производные от matlab.unittest.TestCase класс может реализовать тестовую параметризацию, используя специфичные для платформы атрибуты свойств и методов. Чтобы предоставить данные в качестве параметров в тесте на основе классов, укажите данные с помощью properties блок с соответствующим атрибутом параметризации. Затем передайте свойство параметризации в качестве входного аргумента одному или нескольким методам.
Например, рассмотрим SampleTest класс. Класс определяет параметризованный тест, поскольку он задает свойство в properties блок с TestParameter атрибут. Свойство передается в Test способ и используется для проведения квалификации.
classdef SampleTest < matlab.unittest.TestCase properties (TestParameter) Number = {1,2,'3',4,5}; end methods(Test) function testDouble(testCase,Number) testCase.verifyClass(Number,'double') end end end
Поскольку Number является массивом ячеек с пятью элементами, класс теста приводит к параметризованному набору тестов с пятью элементами.
suite = testsuite('SampleTest');
{suite.Name}'
ans =
5×1 cell array
{'SampleTest/testDouble(Number=value1)'}
{'SampleTest/testDouble(Number=value2)'}
{'SampleTest/testDouble(Number=value3)'}
{'SampleTest/testDouble(Number=value4)'}
{'SampleTest/testDouble(Number=value5)'}
Значение, назначенное свойству параметризации, должно быть либо непустым массивом ячеек, либо скалярной структурой по крайней мере с одним полем. MATLAB ® использует значение свойства для указания имен и значений параметров в наборе тестов:
Если значение свойства является массивом ячеек символьных векторов, MATLAB генерирует имена параметров из значений в массиве ячеек. В противном случае MATLAB определяет имена параметров как value1, value2, …, valueN.
Если значением свойства является структура, поля структуры представляют имена параметров, а значения структуры представляют значения параметров. Чтобы включить описательные имена параметров в набор, определите параметры с помощью структуры вместо массива ячеек.
При определении свойства параметризации необходимо инициализировать свойство, чтобы MATLAB мог генерировать имена и значения параметров. Свойство можно инициализировать либо во время загрузки класса теста, либо во время создания набора тестов:
Время загрузки класса: Если значение свойства может быть определено во время загрузки MATLAB определения класса теста, инициализируйте свойство, используя значение по умолчанию. Можно указать значение по умолчанию в properties блок или использование локальной функции в classdef файл. Дополнительные сведения о назначении значений в определении класса см. в разделе Оценка выражений в определениях классов.
При инициализации свойства параметризации во время загрузки класса параметры, связанные со свойством, остаются фиксированными для различных тестовых запусков. Каждый раз при создании набора из класса параметризованного теста инфраструктура использует одни и те же имена параметров и значения для выполнения тестов. Пример использования свойств параметризации со значениями по умолчанию см. в разделе Создание базового параметризованного теста.
Время создания пакета: Если вы не можете или не хотите определять параметры во время загрузки класса, инициализируйте свойство во время создания пакета с помощью статического метода с помощью TestParameterDefinition атрибут. При инициализации свойства параметризации с помощью TestParameterDefinition параметры, связанные со свойством, могут изменяться для различных тестовых запусков. Каждый раз при создании набора из класса параметризованного теста фреймворк генерирует новые имена параметров и значения для выполнения тестов. Дополнительные сведения см. в разделе Определение параметров во время создания пакета.
После назначения значения свойству параметризации не изменяйте его. Например, при инициализации свойства параметризации с использованием значения по умолчанию нельзя использовать TestParameterDefinition для перезаписи значения по умолчанию.
Параметр может использоваться в нескольких единичных тестах. Тесты, использующие один и тот же параметр, должны выполняться независимо, без случайного воздействия друг на друга. Кроме того, выполняемый тест не должен влиять на последующие повторные повторы того же теста. Чтобы обеспечить независимость тестового запуска, инициализируйте свойства параметризации объектами значений. Использование объектов-дескрипторов (например, графических объектов MATLAB) в качестве значений параметров не рекомендуется. Дополнительные сведения о поведении объектов значений и дескрипторов см. в разделе Сравнение классов дескрипторов и значений.
Если необходимо протестировать объекты-дескрипторы в параметризованном тесте, попробуйте создать их косвенно, используя дескрипторы функций в качестве значений параметров и вызывая эти дескрипторы функций в тестах. Например, запишите параметризованный тест для проверки текущей точки фигур по умолчанию, созданных с помощью figure и uifigure функции.
classdef FigureTest < matlab.unittest.TestCase properties (TestParameter) FigureType = {@figure, @uifigure}; end methods(Test) function defaultCurrentPoint(testCase,FigureType) fig = FigureType(); testCase.addTeardown(@close,fig) cp = fig.CurrentPoint; testCase.verifyEqual(cp,[0 0]) end end end
Тестовый класс можно параметризовать на трех уровнях: настройка класса, настройка метода и тестирование. Параметризация на каждом уровне требует, чтобы свойства параметризации имели определенный атрибут свойства. Например, на высшем уровне TestClassSetup метод может быть параметризован с помощью свойства, определенного в properties блок с ClassSetupParameter атрибут. На самом низком уровне Test метод может быть параметризован с помощью свойства, определенного в properties блок с TestParameter атрибут.
В этой таблице показаны различные уровни параметризации и требуемые атрибуты метода и свойства для каждого уровня.
| Уровень параметризации | Определение параметризации | Доступные свойства параметризации | |
|---|---|---|---|
| Атрибут метода | Атрибут свойства | ||
| Уровень настройки класса | TestClassSetup | ClassSetupParameter | ClassSetupParameter |
| Уровень настройки метода | TestMethodSetup | MethodSetupParameter | MethodSetupParameter и ClassSetupParameter |
| Уровень тестирования | Test | TestParameter | TestParameter, MethodSetupParameter, и ClassSetupParameter |
Параметризованный метод может обращаться к свойствам параметризации в зависимости от уровня, на котором определен метод:
Параметризовавший TestClassSetup метод может обращаться к свойствам параметризации только с помощью ClassSetupParameter атрибут.
Параметризовавший TestMethodSetup метод может обращаться к свойствам параметризации только с помощью MethodSetupParameter или ClassSetupParameter атрибуты.
Параметризовавший Test метод может обращаться к любым свойствам параметризации.
Пример параметризации класса теста на различных уровнях см. в разделе Создание расширенного параметризованного теста.
При передаче метода нескольких свойств параметризации можно использовать ParameterCombination атрибут метода для указания способа объединения параметров. Структура тестирования вызывает метод для указанных комбинаций.
В этой таблице представлены различные стратегии комбинирования параметров.
ParameterCombination Признак | Вызов метода |
|---|---|
'exhaustive' (по умолчанию) | Методы вызываются для всех комбинаций значений параметров. В среде тестирования используется эта комбинация по умолчанию, если не указан параметр |
'sequential' | Методы вызываются с соответствующими значениями каждого параметра. Каждый параметр должен содержать одинаковое количество значений. Например, если метод имеет два свойства параметризации и каждое свойство задает три значения параметров, то фреймворк вызывает метод три раза. |
'pairwise' | Методы вызываются для каждой пары значений параметров по крайней мере один раз. Например, если метод имеет три свойства параметризации, структура тестирования гарантирует, что метод вызывается для каждой комбинации значений параметров, заданных любыми двумя свойствами. По сравнению с |
Можно комбинировать параметры на уровнях «класс-настройка», «метод-настройка» и «тест». Например, используйте атрибуты комбинированного метода TestMethodSetup, ParameterCombination = 'sequential' для указания последовательной комбинации параметров уровня настройки метода, определенных в properties блок с MethodSetupParameter атрибут.
Примеры объединения параметров теста см. в разделах Создание базового параметризованного теста и Создание расширенного параметризованного теста.
При создании параметризованного теста можно переопределить параметры путем ввода входных данных в тест на основе классов. Чтобы предоставить данные, определенные вне тестового файла, создайте Parameter экземпляра и использовать 'ExternalParameter' при создании набора тестов. Дополнительные сведения см. в разделе Использование внешних параметров в параметризованном тесте.
matlab.unittest.parameters | matlab.unittest.parameters.Parameter | matlab.unittest.TestCase