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

Можно ввести вводы переменной в существующий основанный на классах тест. Чтобы обеспечить тестовые данные, который задан вне тестового файла и это должно использоваться итеративно тестом (через параметризованное тестирование), создать 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.27887    [1×1 struct]
    'TestClean/classCheck(Data=needsCleaning)'     true      false       false       0.0069881    [1×1 struct]
    'TestClean/sortCheck(Data=clean)'              true      false       false       0.0046028    [1×1 struct]
    'TestClean/sortCheck(Data=needsCleaning)'      true      false       false       0.0035363    [1×1 struct]
    'TestClean/finiteCheck(Data=clean)'            true      false       false        0.023965    [1×1 struct]
    'TestClean/finiteCheck(Data=needsCleaning)'    true      false       false       0.0024557    [1×1 struct]
    'TestClean/noZeroCheck(Data=clean)'            true      false       false          0.7077    [1×1 struct]
    'TestClean/noZeroCheck(Data=needsCleaning)'    true      false       false       0.0093186    [1×1 struct]

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

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

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

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

Создайте и новый тестовый набор и просмотрите имена элементов комплекта. 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
__________

Смотрите также

|

Похожие темы