Используйте внешние параметры в параметризованном тесте

Можно ввести входы переменных в существующий основанный на классах тест. Чтобы предоставить тестовые данные, которые определены вне тестового файла и которые должны использоваться итеративно тестом (через параметризованную проверку), создайте Parameter и используйте 'ExternalParameters' опция для TestSuite методы создания, такие как TestSuite.fromClass.

Создайте следующую функцию для тестирования. Функция принимает массив, векторизирует массив, удаляет 0 Nan, и Inf, а затем сортирует массив.

function Y = cleanData(X)
    Y = X(:);         % Vectorize array
    Y = rmmissing(Y); % Remove NaN
    % Remove 0 and Inf
    idx = (Y==0 | Y==Inf);
    Y = Y(~idx);
    % If array is empty, set to eps
    if isempty(Y)
        Y = eps;
    end
    Y = sort(Y);      % Sort vector
end

Создайте следующий параметризованный тест для cleanData функция. Тест повторяет каждый из четырех методов тестирования для двух наборов данных, которые определены в properties блок.

classdef TestClean < matlab.unittest.TestCase
    properties (TestParameter)
        Data = struct('clean',[5 3 9;1 42 5;32 5 2],...
            'needsCleaning',[1 13;NaN 0;Inf 42]);
    end
    methods (Test)
        function classCheck(testCase,Data)
            act = cleanData(Data);
            testCase.assertClass(act,'double')
        end
        function sortCheck(testCase,Data)
            act = cleanData(Data);
            testCase.verifyTrue(issorted(act))
        end
        function finiteCheck(testCase,Data)
            import matlab.unittest.constraints.IsFinite
            act = cleanData(Data);
            testCase.verifyThat(act,IsFinite)
        end
        function noZeroCheck(testCase,Data)
            import matlab.unittest.constraints.EveryElementOf
            import matlab.unittest.constraints.IsEqualTo
            act = cleanData(Data);
            testCase.verifyThat(EveryElementOf(act),~IsEqualTo(0))
        end
    end    
end

Создайте и запустите параметризованный тестовый набор. Просмотр результатов. Среда запускает восемь параметризованных тестов, используя данные, определенные в тестовом файле.

import matlab.unittest.TestSuite
suite1 = TestSuite.fromClass(?TestClean);
results = suite1.run;
table(results)
Running TestClean
........
Done TestClean
__________


ans =

  8×6 table

                        Name                         Passed    Failed    Incomplete    Duration       Details   
    _____________________________________________    ______    ______    __________    _________    ____________

    {'TestClean/classCheck(Data=clean)'         }    true      false       false         0.19182    {1×1 struct}
    {'TestClean/classCheck(Data=needsCleaning)' }    true      false       false       0.0037433    {1×1 struct}
    {'TestClean/sortCheck(Data=clean)'          }    true      false       false       0.0030112    {1×1 struct}
    {'TestClean/sortCheck(Data=needsCleaning)'  }    true      false       false       0.0023779    {1×1 struct}
    {'TestClean/finiteCheck(Data=clean)'        }    true      false       false        0.044825    {1×1 struct}
    {'TestClean/finiteCheck(Data=needsCleaning)'}    true      false       false       0.0031761    {1×1 struct}
    {'TestClean/noZeroCheck(Data=clean)'        }    true      false       false         0.73055    {1×1 struct}
    {'TestClean/noZeroCheck(Data=needsCleaning)'}    true      false       false       0.0070594    {1×1 struct}

Создайте набор данных, внешний по отношению к тестовому файлу.

A = [NaN 2 0;1 Inf 3];

Создайте параметр с набором внешних данных. The fromData метод принимает имя параметризованного свойства из properties блок в TestClean и новые данные как массив ячеек (или struct).

import matlab.unittest.parameters.Parameter
newData = {A};
param = Parameter.fromData('Data',newData);

Создайте новый тестовый набор и просмотрите имена элементов набора. The fromClass метод принимает новый параметр.

suite2 = TestSuite.fromClass(?TestClean,'ExternalParameters',param);
{suite2.Name}'
ans =

  4×1 cell array

    {'TestClean/classCheck(Data=value1#ext)' }
    {'TestClean/sortCheck(Data=value1#ext)'  }
    {'TestClean/finiteCheck(Data=value1#ext)'}
    {'TestClean/noZeroCheck(Data=value1#ext)'}

Используя внешний параметр, среда создает четыре элемента набора. Поскольку параметры определены как массив ячеек, MATLAB генерирует имя параметра (value1). Кроме того, он добавляет символы #ext в конец имени параметра, указывая, что параметр задан внешне.

Чтобы назначить значимые имена параметров (вместо valueN), задайте параметр с помощью struct. Просмотрите имена элементов набора и запустите тесты.

newData = struct('commandLineData',A);
param = Parameter.fromData('Data',newData);
suite2 = TestSuite.fromClass(?TestClean,'ExternalParameters',param);
{suite2.Name}'
results = suite2.run;
ans =

  4×1 cell array

    {'TestClean/classCheck(Data=commandLineData#ext)' }
    {'TestClean/sortCheck(Data=commandLineData#ext)'  }
    {'TestClean/finiteCheck(Data=commandLineData#ext)'}
    {'TestClean/noZeroCheck(Data=commandLineData#ext)'}

Running TestClean
....
Done TestClean
__________

Создайте другой набор данных, который хранится в файле с разделителем ASCII.

B = rand(3);
B(2,4) = 0;
dlmwrite('myFile.dat',B)
clear B

Создайте параметр с сохраненным набором данных и A.

newData = struct('commandLineData',A,'storedData',dlmread('myFile.dat'));
param2 = Parameter.fromData('Data',newData);
suite3 = TestSuite.fromClass(?TestClean,'ExternalParameters',param2);

Чтобы запустить тесты с использованием параметров, определенных в тестовом файле, и внешне, сгруппируйте тестовые наборы. Просмотрите имена элементов набора и запустите тесты.

suite = [suite1 suite3];
{suite.Name}'
results = suite.run;
ans =

  16×1 cell array

    {'TestClean/classCheck(Data=clean)'               }
    {'TestClean/classCheck(Data=needsCleaning)'       }
    {'TestClean/sortCheck(Data=clean)'                }
    {'TestClean/sortCheck(Data=needsCleaning)'        }
    {'TestClean/finiteCheck(Data=clean)'              }
    {'TestClean/finiteCheck(Data=needsCleaning)'      }
    {'TestClean/noZeroCheck(Data=clean)'              }
    {'TestClean/noZeroCheck(Data=needsCleaning)'      }
    {'TestClean/classCheck(Data=commandLineData#ext)' }
    {'TestClean/classCheck(Data=storedData#ext)'      }
    {'TestClean/sortCheck(Data=commandLineData#ext)'  }
    {'TestClean/sortCheck(Data=storedData#ext)'       }
    {'TestClean/finiteCheck(Data=commandLineData#ext)'}
    {'TestClean/finiteCheck(Data=storedData#ext)'     }
    {'TestClean/noZeroCheck(Data=commandLineData#ext)'}
    {'TestClean/noZeroCheck(Data=storedData#ext)'     }

Running TestClean
........
Done TestClean
__________

Running TestClean
........
Done TestClean
__________

См. также

|

Похожие темы