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