В существующий тест на основе классов можно вводить переменные входные данные. Для предоставления тестовых данных, определенных вне тестового файла и подлежащих итерационному использованию тестом (посредством параметризованного тестирования), создайте 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];
Создайте параметр с набором внешних данных. fromData метод принимает имя параметризованного свойства из properties блок в TestClean и новые данные в виде массива ячеек (или структуры).
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), определите параметр с помощью структуры. Просмотрите имена элементов набора и выполните тесты.
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
__________
matlab.unittest.parameters.Parameter.fromData | matlab.unittest.TestSuite