我在一个共享通用设置(和拆卸)过程的.mt文件中编写了多个测试用例。我希望看到类似JUnit的@Before/@After的东西,但是MUnit包中没有任何东西可以实现这一目标。坦白地说,MUnit软件包文档比Wolfram Workbench的MUnit文档要好一些,但也远远不够完善。 Instructions on viewing the MUnit package.

因此,在我重新发明轮子之前,我想我会检查一下我是否错过了MUnit中的某些内容,或者是否有人有一种运行良好的模式?

因此,基于Leonid Shifrin的初始答案(他在我将其放在一起的同时更新了他的答案),这就是我所在的位置(当时)...

TestPlus.mt

(* Mathematica Test File *)

(* x is a global value *)
x=0;

SetUp[] := Module[{}, x=1;];
TearDown[] := Module[{}, x=0;];

(* test SetUp[] *)
SetUp[];
Test[x, 1, TestID->"SetUp-20120103-F2U9V6"]

(* test TearDown[] *)
TearDown[];
Test[x, 0, TestID->"TearDown-20120103-O4R6M7"]

(* test plus --contrived tests-- *)
SetUp[];
Test[x+0, 1, TestID->"Plus-20120103-S5D9X6"]
TearDown[];

SetUp[];
Test[x+1, 2, TestID->"Plus-20120103-D7Q3E0"]
TearDown[];

SetUp[];
Test[x+2, 3, TestID->"Plus-20120103-F0S4P9"]
TearDown[];

最佳答案

MUnit文件是正常的软件包文件,并且它们是按顺序读取和执行的-至少这是我的经验。您可以在测试之前和之后简单地添加带有通用代码的行,它们将分别在所有测试之前和之后执行。

如果要为每个测试分别调用设置和拆卸程序,则可以在每个测试之前和之后添加相应的行(调用)。然后,您可能会发现编写一个预处理器很方便,该预处理器会将您的测试作为程序包加载(例如,通过使用Import["Tests.tm","HeldExpressions"]-在本示例中,您的测试位于Tests.tm中),然后插入相应的行,然后再次保存文件。这需要使用保持代码进行一些流利的操作,但是可以相当快地进行,如果有很多测试,这将非常方便。

编辑

作为更轻量的替代方案,您可以定义类似宏的快捷方式。这是测试文件内容的示例:

(* Mathematica Test File *)

before[]:= (Print["Before Test: ",f[2]];f[x_]:=x^3);
after[] := (ClearAll[f];Print["After Test: ",f[2]]);

SetAttributes[withCodeAfter,HoldRest];
withCodeAfter[before_,after_]:=(after;before)

SetAttributes[{wrapTest,wrapTest1},HoldAll]
wrapTest[code_]:= withCodeAfter[before[];code,after[]]
wrapTest1[code_]:=Block[{f},f[x_]:=x^3;code];

wrapTest@
Test[f[2],
  8,
  TestID -> "MyTest1"
]

wrapTest1@
Test[f[2],
  8,
  TestID -> "MyTest2"
]

函数beforeafter模仿您的设置/拆卸功能。函数withCodeAfter是一个辅助宏,它首先执行before代码,然后执行after代码,但结果返回before的结果。函数wrapTestwrapTest1说明了两种可能性:您可以定义单独的“before”和“after”函数并将代码夹在中间,或者可以使用Block并定义“around”宏,这有时可能更方便。测试将以任何一种方式进行。您也可以混合使用这些方法。在这两种情况下,样板代码的数量都是最小的-只需在每次测试前添加wrapTest@行即可。

关于wolfram-mathematica - 在MUnit中寻找类似JUnit的@Before/@After,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8718605/

10-11 06:17