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

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

The 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 методы, сделать c lassSetup a TestClassSetup способ.

The 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] - Свойство Class-setup-level и имя параметра

  • 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

См. также

| |

Похожие темы