Задайте параметры во время создания набора

Параметрированные тесты позволяют вам неоднократно запускать ту же процедуру тестирования, с помощью различных значений данных каждый раз. В параметрированном тесте эти значения данных называются параметрами и представлены свойствами параметризации тестового класса. MATLAB® использует свойства параметризации сгенерировать название и значение параметра для каждого тестового прогона.

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

В некоторых случаях MATLAB не может определить значение свойства параметризации, когда это загружает тестовое определение класса. Например, иногда свойство параметризации зависит от другого свойства, заданного на более высоком уровне параметризации. Или вы не можете хотеть, чтобы параметры были определены во время загрузки класса. Например, если параметры представляют файлы в папке, вы можете хотеть обновить параметры каждый раз, когда вы создаете набор, чтобы протестировать файлы. Когда вы не можете или не хотеть инициализировать свойство параметризации во время загрузки класса, инициализировать его во время создания набора с помощью статического метода с TestParameterDefinition атрибут. Когда вы инициализируете свойство параметризации с помощью TestParameterDefinition метод, параметры, сопоставленные со свойством, может варьироваться для различных тестовых прогонов. Другими словами, каждый раз, когда вы создаете тестовый набор из параметрированного тестового класса, среда генерирует новое название и значение параметра, чтобы запустить тесты.

В этом примере показано, как использовать свойства параметризации со значениями не по умолчанию и по умолчанию, чтобы проверить, что публичные свойства группы классов в вашей текущей папке непусты. В нем вы задаете параметрированный тестовый класс под названием PropertiesTest в test подпапка вашей текущей папки. Вы задаете три класса, чтобы протестировать, названный ClassA, ClassB, и ClassC, в source подпапка вашей текущей папки. Для сводных данных этих трех классов смотрите Классы в исходной Подпапке.

Создайте класс PropertiesTest

Протестировать публичные свойства классов, заданных в 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 метод, который принимает входные параметры, входные параметры, должен быть на более высоком уровне параметризации относительно выходных параметров метода. Для получения дополнительной информации об уровнях параметризации, смотрите Параметры Использования в Основанных на классах Тестах.

Задайте тестовый метод Setup класса

Чтобы протестировать на непустые значения свойств, необходимо сначала создать объект класса, протестированного так, чтобы можно было получить значения свойств. Чтобы реализовать это требование, добавьте параметрированный 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

Смотрите также

| |

Похожие темы