如何在私人目录中测试功能?

时间:2010-12-21 14:08:21

标签: unit-testing matlab xunit

我正在使用MATLAB xUnit来测试一些代码。我希望能够直接调用private目录中包含的一些函数。

这是一个简单的可复制设置: 使用两个文件夹codetest创建一个项目目录。在code中,创建一个名为private的子目录,以使目录树看起来像

project_root
  code
    private
  test

code目录中放置一个函数

function y = main()
y = sub();
end

private目录中放置一个功能

function y = sub()
y = 123;
end

test目录中放置一个功能

function testsub()
assertElementsAlmostEqual(sub(), 123);
end

现在导航到测试目录并致电runtests。您应该看到一条错误消息,指出sub未定义。

matlab路径上不允许使用

private个目录,因此这不是一个选项。我可以在code目录中放置一个函数来检索所有私有函数的句柄,但这看起来很糟糕。

访问测试私有函数的最佳方法是什么?

编辑:

导航到私人目录的想法有问题。从理论上讲,我可以打电话,例如,

cd(privateDirectory);
suite = TestSuite.fromName(testDirectory);
suite.run

不幸的是,只要您调用run,测试框架就会导航到包含测试的目录。

3 个答案:

答案 0 :(得分:7)

一种解决方案是从 testsub内的导航到私人目录,使用function handle获取所需的私有函数STR2FUNC,然后导航回来使用该函数句柄进行测试。您甚至可以将这些步骤放在单独的辅助函数中进行单元测试,如下所示:

function privateFcn = get_private_fcn(privateDir,fcnName)
  oldDir = cd(privateDir);         %# Change to the private directory
  privateFcn = str2func(fcnName);  %# Get a function handle
  cd(oldDir);                      %# Change back to the original directory
end

您可以在testsub中使用此功能,如下所示:

function testsub()
  privateDir = '...\project_root\code\private';    %# The path to the private
                                                   %#   directory
  privateFcn = get_private_fcn(privateDir,'sub');  %# Call get_private_fcn
  assertElementsAlmostEqual(privateFcn(), 123);    %# Apply your test
end

虽然MATLAB编辑器给出了M-Lint使用函数CD的警告,但这是有效的:“MCC使用CD功能是有问题的。”我认为忽略此警告是安全的,因为1)函数get_private_fcn更改当前目录,然后在获取函数句柄后立即将其更改回来2)您不是dealing with a deployed application

答案 1 :(得分:3)

虽然您无法在搜索路径上放置私人目录,但您可以cd到私人目录本身。

在那里,MATLAB将看到这些功能,并且可以使用它们。这就是我在私人函数上测试自己的方法。

答案 2 :(得分:1)

私有目录的要点是具有非常有限的可见性的函数,即仅code中的函数。因此,没有任何官方方式(至少我知道)使它们可见。

code/private中检索句柄的函数在我看来是最简洁的方法。

另一种方法是将testsub放在code内。这样做的好处是测试函数总是与他们应该测试的代码一起使用,但您可能会觉得这会“污染”您的代码目录。