我在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语法。”这也有效。那么做这样的事情的正确和最务实的方法是什么?
答案 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,因此这可能对您有所帮助。