【问题标题】:Using unittest with own matlab toolbox将 unittest 与自己的 matlab 工具箱一起使用
【发布时间】:2016-07-15 16:08:39
【问题描述】:

我在 matlab 中继承了一个代码库,我喜欢使用 matlab.unittest 框架对其进行单元测试。

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

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

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

现在,我想为 file1.m 添加一个单元测试。但是,如果我将文件放在 +folder1/file1_test.m 中,file1.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

如果我取消注释导入语句,单元测试可以正常工作。所以目前我必须将所有导入语句添加到每个单独的测试中,我想避免这种情况。有没有更优雅的方式来做这样的事情?

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

【问题讨论】:

    标签: matlab unit-testing


    【解决方案1】:

    import 语句仅适用于使用它们的本地范围,因此如果您希望函数不能使用全限定名称,则必须将 import 语句添加到每个分别发挥作用。

    导入列表范围定义如下:

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

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

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

    result = folder1.file1(testdata.input)
    

    【讨论】:

    • 我接受这个答案,虽然另一个也是非常有趣的方法。就干净的代码而言,不幸的是,这个解决方案可能比我所希望的更好。
    【解决方案2】:

    目前,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
    

    请注意,在此示例中,我“导入”了您的源代码以及一些测试框架源代码,以便使用 verifyThat 使用文字形式的 verifyEqual。请注意,这是相同的功能行为,但总的来说,constraints 的功能比qualification methods 的功能更多,因此这在某些时候可能会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2020-09-09
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多