exponenta event banner

Определение параметров во время создания пакета

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

  • testPropertyTest имя метода

  • (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

См. также

| |

Связанные темы