单元测试 – 单元测试揭示M文件子功能的最简单的方法是什么?

我最近一直在修补我的Matlab开发周期,并且将不断的测试完全整合在一起,遇到了一个问题,我不知道该怎么解决.几乎所有的用户都知道,从M文件以外的任何功能的角度来看,Matlab善于隐藏M文件中的子功能.下面可以看到玩具的例子:

function [things] = myfunc(data)
  [stuff] = mysubfunc(data)
  things = mean(stuff);
end

我想在subfunc本身执行单元测试.这是AFAIK,不可能,因为我不能从任何外部函数调用它.

我目前正在使用Steve Eddins的Matlab xUnit,无法解决这个问题.简单的解决方案 – 将subfunc分解为自己的M文件 – 在实践中是不能接受的,因为我将有许多小功能,我想测试,不想用一个单独的M文件污染我的文件系统.我可以做什么来编写和执行简单的单元测试,而不需要为每个要测试的功能新的文件?

最佳答案
您一般需要做的是从主功能中获取function handles到您的子功能,并将它们传递到您可以单元测试它们的功能之外.一种方法是修改您的主要功能,以便给定一组特定的输入参数(即无输入,参数的一些标志值等),它将返回您需要的功能句柄.

例如,您可以将几行代码添加到函数的开头,以便在未指定输入时返回所有子功能句柄:

function things = myfunc(data)
  if nargin == 0                            %# If data is not specified...
    things = {@mysubfunc @myothersubfunc};  %# Return a cell array of
                                            %#   function handles
    return                                  %# Return from the function
  end
  %# The normal processing for myfunc...
  stuff = mysubfunc(data);
  things = mean(stuff);
end
function mysubfunc
  %# One subfunction
end
function myothersubfunc
  %# Another subfunction
end

或者,如果您希望指定一个输入标志(为了避免任何与意外调用功能相关联的混乱,Jonas在其注释中提到),则当输入参数数据是特定字符串时,可以返回子功能句柄.例如,您可以将上述代码中的输入检查逻辑更改为:

if ischar(data) && strcmp(data,'-getSubHandles')

转载注明原文:单元测试 – 单元测试揭示M文件子功能的最简单的方法是什么? - 代码日志