Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

在参数化测试中使用外部参数

您可以将变量输入插入到基于类的现有测试中。要提供在测试文件外定义并且应该由测试迭代使用(通过参数化测试)的测试数据,请创建一个 Parameter 并使用 'ExternalParameters' 选项作为 TestSuite 创建方法,例如 TestSuite.fromClass

创建以下函数进行测试。该函数接受数组,对数组进行向量化,删除 0、NanInf,然后对数组进行排序。

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 方法接受来自 TestCleanproperties 模块的参数化属性的名称,以及元胞数组(或结构体)形式的新数据。

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
__________

另请参阅

|

相关主题