exponenta event banner

matlab.test.behavior.Отсутствующий класс

Пакет: matlab.test.behavior
Суперклассы: 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, можно использовать функциональные возможности платформы модульного тестирования.

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

Abstract
true
HandleCompatible
true

Сведения об атрибутах класса см. в разделе Атрибуты класса.

Свойства

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

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

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

Пример: NaN или missing или ' '

Атрибуты:

SetAccess
public
GetAccess
public
Abstract
true

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

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

Атрибуты:

SetAccess
public
GetAccess
public
Abstract
true

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

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

Пример: "string" или ["double","single"]

Атрибуты:

SetAccess
public
GetAccess
public
Abstract
true

Типы данных: string

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

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

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

Атрибуты:

SetAccess
protected
GetAccess
public

Типы данных: logical

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

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

Атрибуты:

SetAccess
protected
GetAccess
public

Типы данных: logical

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

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

Атрибуты:

SetAccess
protected
GetAccess
public

Типы данных: logical

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

Пример: 0

Атрибуты:

SetAccess
protected
GetAccess
public

Примеры

свернуть все

Создать 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