创建具有复杂属性的参数化Matlab单元测试

时间:2016-02-09 14:58:35

标签: matlab unit-testing parameterized-unit-test

我正在尝试创建一个参数化的Matlab单元测试,其中Iterator::operator[]属性由某些代码“动态”生成(例如,使用Array::operator[]循环)。

作为简化示例,假设我的代码是

TestParameter

但在我的真实代码中,我有100个级别。我试着把它放在一个单独的方法中,比如

for

但这不起作用;我得到了错误(Matlab 2014b):

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

我可以将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 函数移动到另一个文件,但我想将它保存在一个文件中。

1 个答案:

答案 0 :(得分:4)

在这里(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'))

注意

作为一个本地函数,它不会在课外看到。如果您还需要公开它,只需添加一个静态函数作为一个简单的包装器:

classdef partest < matlab.unittest.TestCase
    ...

    methods (Static)
        function level = GetLevelFunc()
            level = getLevel();
        end
    end
end

function level = getLevel()
    ...
end