Используйте параметры в основанных на классах тестах

Часто вам нужно запустить серию тестов, которые отличаются только с точки зрения тестовых данных. Например, можно хотеть проверить, что функция создает ожидаемые выходы для различных входов. В этом случае логика тестирования одинаковое и единственное различие между тестами - это фактическое и ожидаемые значения для каждого вызова функции. С параметризованной проверкой можно реализовать код, чтобы итерационно запустить тесты с различными значениями данных. Когда метод параметризован, среда тестирования автоматически вызывает метод для каждого значения параметров. Поэтому вам не требуется реализовывать отдельный метод для каждого значения.

Среда тестирования позволяет вам параметризовать класс тестирования на разных уровнях. Кроме того, когда вы вызываете метод тестового класса с несколькими параметрами, можно задать, как метод должен быть вызван для различных комбинаций параметров.

Как записать параметризованные тесты

Классы, которые получают из 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 атрибут.

В этой таблице показаны различные уровни параметризации и необходимые атрибуты метода и свойств для каждого уровня.

Уровень параметризацииОпределение параметризацииДоступные свойства параметризации
Атрибут методаАтрибут свойства
Уровень настройки классаTestClassSetupClassSetupParameterClassSetupParameter
Уровень настройки методаTestMethodSetupMethodSetupParameterMethodSetupParameter и ClassSetupParameter
Уровень тестированияTestTestParameterTestParameter, MethodSetupParameter, и ClassSetupParameter

Параметризованный метод может получить доступ к свойствам параметризации в зависимости от уровня, на котором задан метод:

  • Параметризированный TestClassSetup метод может получить доступ к свойствам параметризации только с помощью ClassSetupParameter атрибут.

  • Параметризированный TestMethodSetup метод может получить доступ к свойствам параметризации только с помощью MethodSetupParameter или ClassSetupParameter атрибуты.

  • Параметризированный Test метод может получить доступ к любым свойствам параметризации.

Пример параметризации тестового класса на разных уровнях см. в разделе «Создание расширенного параметризованного теста».

Задайте, как объединяются параметры

Когда вы передаете больше одного свойства параметризации в метод, можно использовать ParameterCombination атрибут метода, чтобы задать, как параметры объединяются. Среда тестирования вызывает метод для заданных комбинаций.

В этой таблице показаны различные стратегии комбинации параметров.

ParameterCombination ПризнакВызов метода
'exhaustive' (по умолчанию)

Методы вызываются для всех комбинаций значений параметров. Среда тестирования использует эту комбинацию по умолчанию, если вы не задаете ParameterCombination атрибут.

'sequential'

Методы вызываются с соответствующими значениями от каждого параметра. Каждый параметр должен содержать одинаковое количество значений. Для примера, если метод обеспечен двумя свойствами параметризации, и каждое свойство задает три значения параметров, то среда трижды вызывает метод.

'pairwise'

Методы вызываются для каждой пары значений параметров, по крайней мере, один раз. Для примера, если метод обеспечен тремя свойствами параметризации, среда тестирования гарантирует, что метод вызывается для каждой комбинации значений параметров, заданных любыми двумя свойствами.

По сравнению с 'exhaustive' комбинация, 'pairwise' комбинация обычно приводит к меньшему количеству тестов и, следовательно, более быстрому выполнению теста. Хотя среда гарантирует, что тесты создаются для каждой пары значений хотя бы один раз, вы не должны полагаться на размер пакета, упорядоченное расположение или определенный набор элементов тестового набора.

Можно объединить параметры на уровнях class-setup, method-setup и test. Для примера используйте объединенные атрибуты метода TestMethodSetup, ParameterCombination = 'sequential' для задания последовательной комбинации параметров уровня настройки метода, определенных в properties блок со MethodSetupParameter атрибут.

Для примеров того, как объединить тестовые параметры, смотрите, Создают Основной Параметризованный Тест и Создают Расширенный Параметризованный Тест.

Используйте внешние параметры в тестах

Когда вы создаете параметризованный тест, можно переопределить параметры, введя входы в основанный на классах тест. Чтобы предоставить данные, которые определены вне тестового файла, создайте Parameter образец и использовать 'ExternalParameter' опция при создании тестового набора. Для получения дополнительной информации смотрите Использование внешних параметров в параметризованном тесте.

См. также

| |

Похожие темы