Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 如何在(Mathematica)MUnit中捕获系统错误?_Wolfram Mathematica - Fatal编程技术网

Wolfram mathematica 如何在(Mathematica)MUnit中捕获系统错误?

Wolfram mathematica 如何在(Mathematica)MUnit中捕获系统错误?,wolfram-mathematica,Wolfram Mathematica,背景: 我为一个新类编写了一个测试(在Mathematica的OO系统中)。我使用Workbench运行了测试,我预期MUnit测试报告会失败,因为该类还不存在(先测试,后编码方法) 测试是: Test[ clist = loadClass["UList"] , Class["UList`"] , TestID->"UListTest-20110730-loadClass" ] MUnit根本没有报告,MUnit没有

背景:

我为一个新类编写了一个测试(在Mathematica的OO系统中)。我使用Workbench运行了测试,我预期MUnit测试报告会失败,因为该类还不存在(先测试,后编码方法)

测试是:

 Test[
     clist = loadClass["UList"]         
     ,
     Class["UList`"]
     ,
     TestID->"UListTest-20110730-loadClass"
 ]
MUnit根本没有报告,MUnit没有得到控制,它过早地结束了,这是在Workbench的控制台窗口中报告的

 -------------------
 Start Run Session
 Connected
 <<X3/Kernel/init.m
 Initialization Complete
 Running Test File: X3/Tests/UListTest.mt

 {Get::noopen}
 Error -> Exit
 End Session
 -------------------
-------------------
启动运行会话
有联系的

如果我正确理解了您的示例,您是否只需要(1)将类[“UList`]”移动到求值部分,并(2)将预期输出更改为{Get::noopen}

好的,这里有几个部分

首先,我设置了一个WB项目来测试您的输入,虽然我在运行单元测试时确实收到了相同的错误消息,但我没有得到内核挂起-相反,我要么让测试失败(如果我没有将测试代码包装在
Quiet
-请参见下面的解释),要么它过早退出(出于原因,也请参见下面的说明)。但请注意,我更改了
oosys'
上下文名称(另请参见下文)

需要检查的一件事是,在WB项目中,包的上下文应该是应用程序主上下文的子上下文。因此,
oosys'
变成(在我的例子中)
OOSystemTests'oosys'
。这应该反映在包本身和包导入(调用
Needs
ets)中。例如,您的
oosys
版本将以
BeginPackage[“OOSystemTests'oosys'”开头(将单引号更改为上下文标记)

接下来,一件值得注意的事情是,在单元测试运行期间生成的消息在默认情况下被视为错误,因此测试将失败。您可以指定消息是预期的,以避免这种情况(有关详细信息,请参见第页),或者您可以将测试代码包装在
Quiet
)中。您应该执行这两种操作中的任何一种,以通过测试,直到测试结束(我将测试代码包装在
静默

一旦这样做,测试就会运行,但是
MUnit
报告内核过早退出。这让我们回到应用程序,
OO系统
。在我看来,它确实包含了一些有趣的想法,但从几个方面来看,它并不是一个专业编写的mma扩展包。首先,它过早退出的原因:如果查看
loadClass
实现,您会注意到对
checkClass
函数的调用,在该函数中可以看到对
Quit[]
的大量调用。我不知道我是否应该解释为什么这样做是错误的,但我之前已经说过很多,在较低级别的函数中调用
Quit[]
是没有列出的,这是有原因的。这甚至不是特定于mma的:软件工程中的一个标准智慧是,较低级别的功能通常不应该做出只有高级功能才能解决的规模决策(例如退出应用程序)。我在阅读代码时注意到的另一个地方是
newContext
函数,其中
oosys'
上下文被显式地列为字符串(硬编码),这意味着每当上下文名称发生更改时(比如,在我们的例子中)都有可能中断。调试的组织方式对我来说也不太令人兴奋。也许,还有其他事情,我没有仔细阅读


我希望我给出了足够的提示,以便您能够顺利通过
MUnit
,并获得理想的结果,或许可以在此过程中修改一些OO系统源代码(如果许可证允许的话)。在这方面,我要重复我已经给你的一个建议:如果你想真正有效地使用它,请仔细阅读代码,采纳好的想法(我肯定有),并以你想要的方式实现你自己的对象模型,这样你就可以控制所有的代码

关于“绞刑”,我错了。这确实是穆尼特的过早结束。这看起来很有希望。今天晚上我将详细讨论你的答案。非常感谢。我的设置必须正常,因为我已经用oosys进行了一段时间的MUnit测试。正是这种特殊的测试让弹药过早退出。当我加载一个还不存在的类时,就会发生这种情况。-你能让MUnit在这种情况下失败吗?还是应该将测试包装在安静的[]中?整个测试?还是仅仅创造了预期的结果-关于面向对象系统。它可能并不完美,我认为作者做得很好!当然,这并不完美。作者没有积极维护它,我给他写过一次信,但没有回复。文件中没有许可证,也没有(c),我想我们可以将其解释为捐赠。我会把它当作是LGPL授权的。当我的应用程序有足够的质量时,我会深入研究oosys。目前我正在为它开发util类型的库。@nilo de roock我不能让测试失败,但我可以让它通过。MUnit的配置使得任何错误消息(除非明确指定)都会导致内核过早退出。在
Quiet
中包装测试代码,如下所示:`Quiet[clist=loadClass[“UList”]]
。要查看发生了什么,请设置
MFDebug=True;`在测试前,在
.mt
文件中。您将看到,现在内核退出是由于
checkClass
函数引起的。在源代码('oosys')中注释掉它,您的测试就会通过。要使其失败,您可以添加代码来分析错误消息,如果您:1,可以使用
Check
@nilo de roock。注释掉
checkClass
,然后2。使用以下代码:
Quiet[Check[clist=loadClass[“UList”],$Failed]]
,您将使测试失败,而不是让内核过早退出。关于OO系统,我毫不怀疑它有它的优点,我的观点不是它有多好或多坏,而是你能控制多少代码,从某种意义上说是OO