【问题标题】:How to make internal/helper functions testable?如何使内部/辅助功能可测试?
【发布时间】:2014-08-14 16:25:50
【问题描述】:

假设我有一些函数 Foo 使用两个内部辅助函数 bar 和 baz。

有没有办法组织代码使bar 和baz 保持“看不见”,但同时可以进行单元测试? (最好bar 和baz 的单元测试与主函数Foo 的单元测试在同一个套件中。)

【问题讨论】:

  • 即使它只是一个辅助函数,以牺牲更多字符为代价,我会避免调用函数 bar 以免与 matlab 内置函数产生歧义(除非你故意想要超载它)

标签: matlab unit-testing


【解决方案1】:

有几个选项可以实现这一点。

首先,Foo 需要是一个函数吗?如果它是一个类,那么您可以将bar 和baz 实现为Hidden 和Access='protected',这是非常严格的锁定。然后你可以创建一个测试特定的子类来访问bar 和baz 进行测试。如果需要,您还可以scope the access 进行测试以进一步锁定它,使其不被其他人查看。

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

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

【讨论】:

    【解决方案2】:

    这不是最优雅的方式,但 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 函数,而不必显式调用它(因此如果不是,辅助函数将保持“看不见”显式调用)。


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

    【讨论】:

      猜你喜欢
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      相关资源
      最近更新 更多