创建具有复杂属性的参数化 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