使用unittest和自己的matlab工具箱

时间:2016-07-15 16:08:40

标签: matlab unit-testing

我在matlab中继承了一个代码库,我喜欢将它放在使用matlab.unittest框架的unittest下。

为了使代码库对我的用户的任意添加路径更加健壮,我已将大部分代码放入+文件夹中,就像工具箱一样。所以总体布局是:

+folder1/file1.m
+folder1/runtestsuite.m
+folder1/unittest_data/file1_testdata.mat
+folder1/+folder2/file2.m
+folder1/+folder2/unittest_data/file2_testdata.mat
...

并使用正确的import语句更新所有内部引用。

现在,我想为file1.m添加unittest。但是,如果我将文件放在+ folder1 / file1_test.m文件中,则文件似乎不可见。

这是我的file1_test.m

的示例代码
classdef file1_test < matlab.unittest.TestCase
   properties
        path
   end

    methods(TestMethodSetup)        
        function setunittestdatapath(testCase)
            p = mfilename('fullpath');
            [directory,~,~]=fileparts(p);            
            testCase.path = fullfile(directory,'unittest_data');
        end
    end


    methods (Test)
        function file1_input(testCase)
            %import folder1.file1
            testdata = load(fullfile(testCase.path),'file1_testdata.mat');
            result = file1(testdata.input);
            testCase.verifyEqual(result, testdata.output);
        end

    end
end

如果我取消注释import语句,unittest工作正常。因此,目前我必须将所有import语句添加到每个单独的测试中,我希望避免这些测试。做这样的事情会有更优雅的方式吗?

我尝试在文件的开头导入它,虽然matlab抱怨“CLASSDEF上的解析错误:使用可能是无效的MATLAB语法。”这也有效。那么做这样的事情的正确和最务实的方法是什么?

2 个答案:

答案 0 :(得分:0)

import语句仅适用于使用它们的本地范围,因此如果您希望函数不能使用完全限定名称,则必须添加{{1} }声明分别对每个函数。

  

导入列表范围定义如下:

     
      
  • 从MATLAB®命令提示符调用的脚本 - Scope是基础MATLAB工作区。

  •   
  • 函数,包括嵌套函数和本地函数 - 作用域是函数,函数不共享父函数的导入列表。如果MATLAB函数或脚本以及任何本地函数中需要导入列表,则必须为每个函数调用导入函数。

  •   

对于单元测试,我认为最好每次都使用完全限定的函数名称(而不是依赖于import),以便用户清楚您正在测试的是什么。

import

答案 1 :(得分:0)

目前,MATLAB中的import语句具有Suever答案中提到的功能范围。

但是,我经常使用本地函数作为模拟文件级别导入的变通方法:

classdef file1_test < matlab.unittest.TestCase
   properties
        path
   end

    methods(TestMethodSetup)        
        function setunittestdatapath(testCase)
            p = mfilename('fullpath');
            [directory,~,~]=fileparts(p);            
            testCase.path = fullfile(directory,'unittest_data');
        end
    end


    methods (Test)
        function file1_input(testCase)
            %import folder1.file1
            testdata = load(fullfile(testCase.path),'file1_testdata.mat');
            result = file1(testdata.input);
            testCase.verifyThat(result, IsEqualTo(testdata.output));
        end

    end
end

% Include file level "import" functions below
function f = file1(varargin)
f = folder1.file1(varargin{:});
end

function c = IsEqualTo(varargin)
c = matlab.unittest.constraints.IsEqualTo(varargin{:});
end

在这个例子中注意我&#34;导入&#34;您的源代码以及一些测试框架源代码,以便使用verifyThat使用文本形式的verifyEqual。请注意,这是相同的功能行为,但通常constraints存在的功能多于qualification methods,因此这可能对您有所帮助。