如何使内部/辅助函数可测试?

时间:2014-08-14 16:25:50

标签: matlab unit-testing

假设我有一些使用两个内部帮助函数Foobar的函数baz

有没有办法整理代码,以便barbaz保持"看不见",但同时可以进行单元测试? (最好,barbaz的单元测试与主函数Foo的单元测试位于同一套件中。)

2 个答案:

答案 0 :(得分:3)

有几种方法可以实现这一目标。

首先,Foo是否需要成为一个函数?如果它是一个类,那么您可以将barbaz实现为HiddenAccess='protected',这是非常严格锁定的。然后,您可以创建一个特定于测试的子类,以访问barbaz进行测试。如果需要,您还可以scope the access进行测试以进一步将其与其他视图锁定。

如果您确实希望Foo成为一个功能,那么您仍然可以选择。其中之一是以某种方式获取测试的私有本地函数的函数句柄。您可以通过Foo的一些特殊调用语法来执行此操作,该语法在调用时将这些函数返回到测试。但是,这会以可能令人困惑的方式修改生产代码,并且它实际上将测试逻辑插入到生产中。我宁愿隐藏这些函数,方法是将它们放入一个包中,使它们不在全局命名空间中。包的名称可以表明它们不受限制,不属于您支持的界面。

最后,一个选项是简单地使用公共接口来测试这些功能。显然,在某些情况下,它们会从函数中调用。您可能需要考虑通过界面的前门编写测试。这样做的一个好处是,您可以轻松地更改本地函数结构的实现,而无需修改测试。私有函数是私有的,因为根据定义它们是您的实现的一部分,而不是您的接口。如果你发现它足够复杂,需要独立于Foo接口的自己的测试,那么它应该只是被分解成另一个包函数或类,如上所述,以便进行单元测试。

答案 1 :(得分:1)

不是最优雅的方式,但Matlab并不是在单个代码文件中构建模块的最实用的语言。 一种方法是使用更高级别的函数将输入参数传递给您选择的函数:

function out = fooModule( FunctionCalled , varargin)
%// This main function only transfer the input argument to the function chosen

   switch FunctionCalled
      case 'main'
         out = foo(varargin) ;

      case 'bar'
         out = mBar(varargin) ;
      case 'baz'
         out = mBaz(varargin) ;
   end  
end

function outFoo = foo(varargin)
   %// your main FOO code
   %// which can call the helper function if necessary
end

function outbar = mBar(varargin)
    %// your code
end

function outbaz = mBaz(varargin)
   %//  your code
end

如果您想要压缩内容,您甚至可以将FunctionCalled参数嵌入varargin。这也可以测试第一个参数的类型。因此,例如,如果第一个参数不是string(调用其中一个辅助函数),则将执行直接转发到主foo函数,而不必显式调用它(因此辅助函数保持“不可见”)如果没有明确调用)。


否则,一种完全不同的方法,你可以考虑写一个类。