创建具有复杂属性的参数化 Matlab 单元测试
Creating parametrized Matlab unittest with complicated properties
我正在尝试创建一个参数化的 Matlab 单元测试,其中 TestParameter
属性由某些代码生成 "dynamically"(例如,使用 for
循环)。
举个简单的例子,假设我的代码是
classdef partest < matlab.unittest.TestCase
properties (TestParameter)
level = struct('level1', 1, 'level2', 2, 'level3', 3, 'level4', 4)
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
但在我的真实代码中,我有 100 个关卡。我试着把它放在一个单独的方法中,比如
classdef partest < matlab.unittest.TestCase
methods (Static)
function level = getLevel()
for i=1:100
level.(sprintf('Level%d', i)) = i;
end
end
end
properties (TestParameter)
level = partest.getLevel()
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
但这不起作用;我收到错误 (Matlab 2014b):
>> runtests partest
Error using matlab.unittest.TestSuite.fromFile (line 163)
The class partest has no property or method named 'getLevel'.
我可以将 getLevel()
函数移动到另一个文件,但我想将它保留在一个文件中。
这里相同(R2015b),看起来 TestParameter
属性 不能用静态函数调用初始化...
幸运的是解决方案很简单,使用 local function 代替:
partest.m
classdef partest < matlab.unittest.TestCase
properties (TestParameter)
level = getLevel()
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
function level = getLevel()
for i=1:100
level.(sprintf('Level%d', i)) = i;
end
end
(请注意,以上所有代码都包含在一个文件中partest.m
)。
现在应该可以了:
>> run(matlab.unittest.TestSuite.fromFile('partest.m'))
注:
作为局部函数,它在 class 之外是不可见的。如果你还需要公开它,只需添加一个静态函数作为简单的包装器:
classdef partest < matlab.unittest.TestCase
...
methods (Static)
function level = GetLevelFunc()
level = getLevel();
end
end
end
function level = getLevel()
...
end
我正在尝试创建一个参数化的 Matlab 单元测试,其中 TestParameter
属性由某些代码生成 "dynamically"(例如,使用 for
循环)。
举个简单的例子,假设我的代码是
classdef partest < matlab.unittest.TestCase
properties (TestParameter)
level = struct('level1', 1, 'level2', 2, 'level3', 3, 'level4', 4)
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
但在我的真实代码中,我有 100 个关卡。我试着把它放在一个单独的方法中,比如
classdef partest < matlab.unittest.TestCase
methods (Static)
function level = getLevel()
for i=1:100
level.(sprintf('Level%d', i)) = i;
end
end
end
properties (TestParameter)
level = partest.getLevel()
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
但这不起作用;我收到错误 (Matlab 2014b):
>> runtests partest
Error using matlab.unittest.TestSuite.fromFile (line 163)
The class partest has no property or method named 'getLevel'.
我可以将 getLevel()
函数移动到另一个文件,但我想将它保留在一个文件中。
这里相同(R2015b),看起来 TestParameter
属性 不能用静态函数调用初始化...
幸运的是解决方案很简单,使用 local function 代替:
partest.m
classdef partest < matlab.unittest.TestCase
properties (TestParameter)
level = getLevel()
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
function level = getLevel()
for i=1:100
level.(sprintf('Level%d', i)) = i;
end
end
(请注意,以上所有代码都包含在一个文件中partest.m
)。
现在应该可以了:
>> run(matlab.unittest.TestSuite.fromFile('partest.m'))
注:
作为局部函数,它在 class 之外是不可见的。如果你还需要公开它,只需添加一个静态函数作为简单的包装器:
classdef partest < matlab.unittest.TestCase
...
methods (Static)
function level = GetLevelFunc()
level = getLevel();
end
end
end
function level = getLevel()
...
end