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