Часто вам нужно запустить серию тестов, которые отличаются только с точки зрения тестовых данных. Например, можно хотеть проверить, что функция создает ожидаемые выходы для различных входов. В этом случае логика тестирования одинаковое и единственное различие между тестами - это фактическое и ожидаемые значения для каждого вызова функции. С параметризованной проверкой можно реализовать код, чтобы итерационно запустить тесты с различными значениями данных. Когда метод параметризован, среда тестирования автоматически вызывает метод для каждого значения параметров. Поэтому вам не требуется реализовывать отдельный метод для каждого значения.
Среда тестирования позволяет вам параметризовать класс тестирования на разных уровнях. Кроме того, когда вы вызываете метод тестового класса с несколькими параметрами, можно задать, как метод должен быть вызван для различных комбинаций параметров.
Классы, которые получают из 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
файл. Дополнительные сведения о присвоении значений в определении класса см. в разделе Оценка выражений в определениях классов.
Когда вы инициализируете свойство параметризации во время загрузки класса, параметры, сопоставленные со свойством, остаются фиксированными для различных тестовых запусков. Каждый раз, когда вы создаете набор из параметризованного тестового класса, среда использует одинаковые названия и значения параметра, чтобы запустить тесты. Смотрите Create Basic Parameterized Test для примера с использованием свойств параметризации с значениями по умолчанию.
Время создания набора: Если вы не можете или не хотите определять параметры во время загрузки класса, инициализируйте свойство во время создания набора с помощью статического метода с TestParameterDefinition
атрибут. Когда вы инициализируете свойство параметризации с TestParameterDefinition
метод, параметры, сопоставленные со свойством, могут варьироваться для различных тестовых запусков. Каждый раз, когда вы создаете набор из параметризованного тестового класса, среда генерирует свежие названия и значения параметра, чтобы запустить тесты. Для получения дополнительной информации смотрите Задать параметры во время создания набора.
Как только вы присвоите значение свойству параметризации, не изменяйте его. Для примера, когда вы инициализируете свойство параметризации с помощью значения по умолчанию, вы не можете использовать TestParameterDefinition
метод для перезаписи значения по умолчанию.
Параметр может использоваться несколькими модульными тестами. Тесты, использующие тот же параметр, должны запускаться независимо, не оказывая случайного влияния друг на друга. В сложение текущий тест не должен влиять на последующие повторения того же теста. Чтобы гарантировать независимость тестового запуска, инициализируйте свойства параметризации с помощью объектов значений. Использование указателя объектов (таких как графические объекты MATLAB) в качестве значений параметров не рекомендуется. Для получения дополнительной информации о поведении объектов значение и указатель, смотрите Сравнение классов Handle и Value.
Если вам нужно протестировать объекты handle в параметризованном тесте, рассмотрите их косвенное построение, используя указатели на функцию в качестве значений параметров и вызывая эти указатели на функцию в тестах. Для примера запишите параметризованный тест, чтобы проверить текущую точку рисунков по умолчанию, созданную с 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
Можно параметризовать тестовый класс на трех уровнях: настройке класса, настройке метода и тесте. Параметризация на каждом уровне требует, чтобы свойства параметризации имели определенный атрибут свойства. Для примера, на самом высоком уровне, a TestClassSetup
метод может быть параметризован с помощью свойства, заданного в properties
блок со ClassSetupParameter
атрибут. На самом низком уровне, a 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' | Методы вызываются для каждой пары значений параметров, по крайней мере, один раз. Для примера, если метод обеспечен тремя свойствами параметризации, среда тестирования гарантирует, что метод вызывается для каждой комбинации значений параметров, заданных любыми двумя свойствами. По сравнению с |
Можно объединить параметры на уровнях class-setup, method-setup и test. Для примера используйте объединенные атрибуты метода TestMethodSetup, ParameterCombination = 'sequential'
для задания последовательной комбинации параметров уровня настройки метода, определенных в properties
блок со MethodSetupParameter
атрибут.
Для примеров того, как объединить тестовые параметры, смотрите, Создают Основной Параметризованный Тест и Создают Расширенный Параметризованный Тест.
Когда вы создаете параметризованный тест, можно переопределить параметры, введя входы в основанный на классах тест. Чтобы предоставить данные, которые определены вне тестового файла, создайте Parameter
образец и использовать 'ExternalParameter'
опция при создании тестового набора. Для получения дополнительной информации смотрите Использование внешних параметров в параметризованном тесте.
matlab.unittest.parameters
| matlab.unittest.parameters.Parameter
| matlab.unittest.TestCase