mATLAB. тест. поведение. Недостающий класс

Пакет: mATLAB. тест. поведение
Суперклассы: matlab.unittest. TestCase

Протестируйте, если класс удовлетворяет контракт для значений missing

Описание

Чтобы протестировать, если значение missing для вашего класса удовлетворяет недостающий контракт в MATLAB®, создайте тестовый класс, который выводит от класса matlab.test.behavior.Missing. Если ваш класс представляет тип данных, и вы хотите, чтобы MATLAB обработал значения missing вашего класса, подобного встроенным классам, гарантировал, что ваш класс удовлетворяет контракт missing.

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

Ваш тест поведения только должен вывести от matlab.test.behavior.Missing и задать абстрактные свойства. Однако, поскольку matlab.test.behavior.Missing является подклассом matlab.unittest.TestCase, можно использовать функциональность Среды Модульного тестирования.

Атрибуты класса

Краткий обзор

tRUE

HandleCompatible

tRUE

Для получения информации об атрибутах класса см. Атрибуты класса.

Свойства

развернуть все

Задайте значения для всех свойств abstract в блоке properties вашего тестового класса.

Отсутствующее значение для класса под тестом, заданным как допустимое скалярное значение MATLAB или выражение, которое возвращает неотсутствующее значение.

Пример: NaN или пропавшие без вести или ''

Атрибуты:

SetAccess

общественность

GetAccess

общественность

Краткий обзор

tRUE

Любое неотсутствующее значение для класса под тестом, заданным как допустимое скалярное значение MATLAB или выражение, которое возвращает неотсутствующее значение. Как правило, если конструктор класса возвращает неотсутствующее значение, PrototypeValue является вызовом конструктора.

Пример: 0 или datetime

Атрибуты:

SetAccess

общественность

GetAccess

общественность

Краткий обзор

tRUE

Список классов, которые могут быть преобразованы в класс под тестом, задал как массив строк имен классов.

Если можно преобразовать в другой класс и затем обратно в класс, то класс имеет поддерживаемое преобразование из другого класса. Например, если MyClass(OtherClass(missing)) == MyClass(missing), чем OtherClass является классом с поддерживаемым covnersions.

Пример: "представьте в виде строки" или ["двойной", "единственный"]

Атрибуты:

SetAccess

общественность

GetAccess

общественность

Краткий обзор

tRUE

Типы данных: строка

При необходимости переопределите значения для конкретных свойств в функции в блоке методов TestClassSetup вашего тестового класса.

Индикатор, что класс поддерживает сравнение, заданное как true или false. Класс, который поддерживает сравнения, позволяет использование == и ~=.

Если вы устанавливаете SupportsComparison на false, ожидаете, что сравнение и заказывающие тесты будут отфильтрованы отказом предположения. MATLAB не запускает тесты.

Атрибуты:

SetAccess

защищенный

GetAccess

общественность

Типы данных: логический

Индикатор, что класс поддерживает упорядоченное расположение, заданное как true или false. Класс, который поддерживает упорядоченное расположение, позволяет использование <, >, <= и >=.

Если вы устанавливаете SupportsOrdering на false, ожидаете, что сопоставленные тесты будут отфильтрованы отказом предположения. MATLAB не запускает тесты.

Атрибуты:

SetAccess

защищенный

GetAccess

общественность

Типы данных: логический

Индикатор, что класс применим как индикатор отсутствующего значения к функции ismissing, заданной как true или false.

Если вы устанавливаете UsableAsMissingIndicator на false, ожидаете, что сопоставленные тесты будут отфильтрованы отказом предположения. MATLAB не запускает тесты.

Атрибуты:

SetAccess

защищенный

GetAccess

общественность

Типы данных: логический

Значение заливки, которое ваш класс использует для роста массивов, заданных как допустимое скалярное значение MATLAB. По умолчанию значение FillValue совпадает со значением свойства MissingValue.

Пример: 0

Атрибуты:

SetAccess

защищенный

GetAccess

общественность

Примеры

свернуть все

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

classdef MyDataClass
    properties
        SomeData;
        MissingVal = false;
    end
    
    methods
        function obj = MyDataClass(value)
            if nargin
                m = size(value,1);
                n = size(value,2);
                for i = 1:m
                    for j = 1:n
                        if ismissing(value(i,j))
                            obj(i,j).MissingVal = true;
                        else
                            obj(i,j).SomeData = value(i,j);
                            obj(i,j).MissingVal = false;
                        end
                    end
                end
            else
                obj.MissingVal = true;
            end
        end
        
        % Define ismissing behavior
        function m = ismissing(obj,v)
            if nargin > 1
                m = isequaln(obj,v);
            else
                m = [obj.MissingVal];
            end
            m = reshape(m,size(obj));
        end
    end
end

Создать простой тестовый класс, который проверяет, что MyDataClass удовлетворяет контракт отсутствующего значения, подкласс, matlab.test.behavior.Missing . тест может использовать функциональность среды модульного тестирования, но MissingValueTest проверяет недостающий контракт только.

classdef MissingValueTest < matlab.test.behavior.Missing
    properties
        MissingValue = MyDataClass;
        PrototypeValue = MyDataClass(7);
        ClassesWithSupportedConversions = [];
    end
end

Запустите тесты и рассмотрите результаты. Тесты для сравнения, упорядоченного расположения, равенства и использования MyDataClass как второй входной параметр к сбою ismissing.

results = runtests('MissingValueTest');
Running MissingValueTest
....
================================================================================
Error occurred in MissingValueTest/comparison and it did not run to completion.

    ---------
    Error ID:
    ---------
    'MATLAB:UndefinedFunction'

    --------------
    Error Details:
    --------------
    Undefined function 'eq' for input arguments of type 'MyDataClass'.
    
    Error in matlab.test.behavior.Missing/comparison (line 129)
                testCase.verifyFalse(testCase.MissingValue == testCase.MissingValue,
                getString(message('MATLAB:test:behavior:missing:EqualFalse')));
================================================================================
.
================================================================================
Error occurred in MissingValueTest/ordering and it did not run to completion.

    ---------
    Error ID:
    ---------
    'MATLAB:UndefinedFunction'

    --------------
    Error Details:
    --------------
    Undefined function 'lt' for input arguments of type 'MyDataClass'.
    
    Error in matlab.test.behavior.Missing/ordering (line 136)
                testCase.verifyFalse(testCase.MissingValue < testCase.MissingValue,
                getString(message('MATLAB:test:behavior:missing:LessThanFalse')));
================================================================================
.
================================================================================
Verification failed in MissingValueTest/isequalRules.

    ----------------
    Test Diagnostic:
    ----------------
    isequal(MissingValue, MissingValue) must return false, because all missing values are unequal.

    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyFalse failed.
    --> The value must evaluate to "false".
    
    Actual Value:
      logical
    
       1

    ------------------
    Stack Information:
    ------------------
    In <matlabroot>\toolbox\matlab\datatypes\+matlab\+test\+behavior\Missing.m (Missing.isequalRules) at 145
================================================================================

================================================================================
Verification failed in MissingValueTest/isequalRules.

    ----------------
    Test Diagnostic:
    ----------------
    isequaln(MissingValue, missing) must return true.

    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyTrue failed.
    --> The value must evaluate to "true".
    
    Actual Value:
      logical
    
       0

    ------------------
    Stack Information:
    ------------------
    In <matlabroot>\toolbox\matlab\datatypes\+matlab\+test\+behavior\Missing.m (Missing.isequalRules) at 147
================================================================================
.
================================================================================
Verification failed in MissingValueTest/IsMissing2ndInput.

    ----------------
    Test Diagnostic:
    ----------------
    ismissing(MissingValue, missing) must return true.

    ---------------------
    Framework Diagnostic:
    ---------------------
    verifyTrue failed.
    --> The value must evaluate to "true".
    
    Actual Value:
      logical
    
       0

    ------------------
    Stack Information:
    ------------------
    In <matlabroot>\toolbox\matlab\datatypes\+matlab\+test\+behavior\Missing.m (Missing.IsMissing2ndInput) at 154
================================================================================
...
Done MissingValueTest
__________

Failure Summary:

     Name                                Failed  Incomplete  Reason(s)
    =================================================================================
     MissingValueTest/comparison           X         X       Errored.
    ---------------------------------------------------------------------------------
     MissingValueTest/ordering             X         X       Errored.
    ---------------------------------------------------------------------------------
     MissingValueTest/isequalRules         X                 Failed by verification.
    ---------------------------------------------------------------------------------
     MissingValueTest/IsMissing2ndInput    X                 Failed by verification.

Многократно обновите MyDataClass, чтобы удовлетворить недостающий контракт. Чтобы удовлетворить сравнение и упорядоченное расположение, задайте eq, ne, lt, gt, le и ge в блоке methods MyDataClass.

        % Class supports comparison
        function tf = eq(obj1,obj2)
            tf = ~any(ismissing([obj1 obj2])) && eq(obj1.SomeData,obj2.SomeData);
        end
        function tf = ne(obj1,obj2)
            tf = ~eq(obj1,obj2);
        end
        
        % Class supports ordering
        function tf = lt(obj1,obj2)
            tf = ~any(ismissing([obj1 obj2])) && lt(obj1.SomeData,obj2.SomeData);
        end
        function tf = gt(obj1,obj2)
            tf = lt(obj2,obj1);
        end   
        function tf = le(obj1,obj2)
            tf = ~any(ismissing([obj1 obj2])) && ~gt(obj1,obj2);
        end
        function tf = ge(obj1,obj2)
            tf = le(obj2,obj1);
        end

Запустите тесты с кратким уровнем выходная деталь и рассмотрите результаты.

results = runtests('MissingValueTest','OutputDetail',1);
......
FAIL: MissingValueTest/isequalRules in Missing.isequalRules at 145 :: verifyFalse failed.

FAIL: MissingValueTest/isequalRules in Missing.isequalRules at 147 :: verifyTrue failed.
.
FAIL: MissingValueTest/IsMissing2ndInput in Missing.IsMissing2ndInput at 154 :: verifyTrue failed.
...

Многократно обновите MyDataClass, чтобы удовлетворить правила равенства. Задайте isqual и isequaln в блоке methods MyDataClass.

        % Class supports isequal/isequaln rules
        function tf = isequal(obj1,obj2)
            tf = eq(obj1,obj2);
        end
        function tf = isequaln(obj1,obj2)
            tf = all(ismissing([obj1 obj2])) || eq(obj1,obj2);
        end

Запустите тесты и рассмотрите результаты. Тестовая передача и MyDataClass удовлетворяют контракт отсутствующего значения.

results = runtests('MissingValueTest');
Running MissingValueTest
..........
Done MissingValueTest
__________

Больше о

развернуть все

Представленный в R2018b

Была ли эта тема полезной?