gpt4 book ai didi

matlab - 在子类中将设置函数与测试一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:13 25 4
gpt4 key购买 nike

我正在为处理时间序列数据的 MATLAB 包编写测试套件。该包使用用户编写的函数对来自各种提供者的数据进行格式化,这些函数将标准输入解析为正确的样式,然后使用 Datafeed Toolbox 请求数据。例如,彭博社的输入 history调用与 Haver 的不同 fetch调用,但我可以使用标准语法来调用其中任何一个,因为我将用户编写的函数中的输入解析为正确的语法。

因为我的每个用户编写的函数的行为都必须相似,所以在设计测试套件时,我写了 myparentclass.m (继承 matlab.unittest.TestCase )来测试它们的一般行为。此外,由于一些用户编写的函数采用特殊输入,我编写了一组子类,mychilclass*.m对于继承 myparentclass.m 的每个提供者并进行更具体的测试。也就是说,当我执行 runtests('mychildclass1') ,我在 mychildclass1.m 中运行这两种方法在myparentclass.m .我使用 setupOnce mychildclass1.m 内部的函数设置用户编写的特定于函数的行为,这些行为是 myparentclass.m 上的初始化属性.

我遇到的问题是我的一项测试mychildclass2.m , 需要初始化目录并将随机数据存储在那里。目前,setupOncemychildclass2.m看起来像这样:

testDir = fullfile(pwd(), 'testdir');
if isequal(exist(testDir, 'dir'), 7)
rmdir(testDir, 's')
end
mkdir(testDir);

startDate = datetime('01-Jan-2018');
endDate = datetime('today');
myDates = transpose(startDate:calmonths(1):endDate);
numDates = length(myDates);
mySeries = randi(10, numDates, 1);
myTable = table(myDates, mySeries);

fname = fullfile(testDir, 'myTable.csv')
writetable(myTable, fname)

我注意到的是,与我的想法相反,setupOnce函数实际上在mychildclass2.m 调用的每个 测试开始时执行(即,包括 myparentclass.m 中的那些)而不是一次。我相信这可能是类继承或 MATALB 执行函数顺序的结果,但我不确定。请注意,由于 mychildclass1.m不需要这个包含数据的文件夹,我不想初始化 myparentclass.m 中的文件夹.

接下来的问题是,我该如何正确编写 setup mychildclass2.m 内的功能以便在所有测试之前只写入一次数据?类似的问题是如何编写 teardown函数在所有测试结束后删除文件夹。

最佳答案

我认为这里的问题是您使用的是 TestMethodSetup 而不是 TestClassSetup。请参阅 Mathworks 文档:Write Setup and Teardown Code Using Classes

相关部分是

  • TestMethodSetup and TestMethodTeardown methods run before and after each test method.
  • TestClassSetup and TestClassTeardown methods run before and after all test methods in the test case.

经过编辑以充实答案

下面是一个如何编写的示例:

classdef mychildclass2 < myparentclass

properties
fname
end

methods (TestClassSetup)
function createTestTable(testCase)
startDate = datetime('01-Jan-2018');
endDate = datetime('today');
myDates = transpose(startDate:calmonths(1):endDate);
numDates = length(myDates);
mySeries = randi(10, numDates, 1);
myTable = table(myDates, mySeries);

testCase.fname = tempname;
writetable(myTable, testCase.fname);
testCase.addTeardown(@delete, testCase.fname);
end
end

methods (Test)

function unitTest1(testCase)
% Do test 1 here
end

function unitTest2(testCase)
% Do test 2 here
end

end

end

注意一些事情:

  1. 您不需要使用关键字 setupsetupOnce 来命名 TestClassSetup 方法 block 中的函数。这些似乎只有在您使用基于函数的单元测试框架时才会使用,请参阅 1

  2. 我没有使用 TestClassTeardown 方法,而是使用了 addTeardown 方法。这是上面链接的文档所推荐的。参见 2举个例子。

  3. 我删除了 testdir 目录的创建,因为它没有多大用处。相反,您可以只使用 tempname 函数为该数据创建一个临时文件。如果您确实需要目录,请使用 tempname 函数的结果作为目录,并将您的 myTable.csv 放入其中。

testDir = tempname;
mkdir(testDir);
testCase.addTeardown(@rmdir, testCase.fname);
testCase.fname = fullfile(testDir, 'myTable.csv');
writetable(myTable, testCase.fname);
testCase.addTeardown(@delete, testCase.fname);

关于matlab - 在子类中将设置函数与测试一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57681403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com