Ищете что-то вроде @Before / @After от JUnit в MUnit - PullRequest
5 голосов
/ 04 января 2012

Я записываю несколько тестовых случаев в один файл .mt, которые используют общие процедуры установки (и разборки).Я надеялся увидеть что-то вроде @Before / @After в JUnit, но ничего из пакета MUnit не выскочило на меня, что это могло бы сделать это.Честно говоря, документация пакета MUnit немного лучше, чем документация Wolfram Workbench's MUnit, но она также далека от завершения. Инструкции по просмотру пакета MUnit.

Поэтому, прежде чем я заново изобрету колесо, я подумал, что хотел бы проверить, пропустил ли я что-то в MUnit или есть ли у кого-нибудь шаблон, который работает хорошо?

Итак, основываясь на Леониде Шифрине первоначальный ответ (он обновил свой ответ, пока я его составлял), это (было) где я (был) в ...

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[];

Ответы [ 2 ]

3 голосов
/ 04 января 2012

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"
]

Функции before и after имитируют ваши функции настройки / демонтажа.Функция withCodeAfter является вспомогательным макросом, который сначала выполняет код before, затем выполняет код after, но в результате возвращает результат before.Функции wrapTest и wrapTest1 иллюстрируют две возможности: вы можете либо определить отдельные функции «до» и «после» и добавить к ним свой код, либо вы можете использовать Block и определить макрос «вокруг», который можетбыть иногда более удобным.Тесты будут работать в любом случае.Вы также можете смешать эти подходы.В обоих случаях количество стандартного кода минимально - просто добавьте строку wrapTest@ перед каждым тестом.

0 голосов
/ 05 января 2012

Я не могу получить правильное форматирование в комментарии, поэтому я делаю это в качестве ответа ...

Хорошо, я думаю, что в вашем ответе приведен код, пожалуйста, дайте мне знать, если я прав.


Определяет, что оценивается до и после оценки «контрольного примера». Примечание: вы определяете f в before, неопределенное f в after.

(* Mathematica Test File *)

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

Определяет функцию withCodeAfter. Он принимает два выражения, первое выражение, before, оценивается при передаче. Второе выражение, after, передается в неоцененном виде и является первым выражением, которое будет оценено в withCodeAfter. Первое вычисленное выражение before возвращается withCodeAfter.

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

Определяет функцию wrapTest. Требуется одно выражение code, которое передается как неоцененное. Это выражение code является вторым выражением составного выражения before[];code, которое передается как первое выражение before в withCodeAfter. Составное выражение before[];code вычисляется при передаче в withCodeAfter. Значение вычисленного выражения, code, возвращается withCodeAfter после after, оцениваемого. Значение, возвращаемое withCodeAfter, возвращается wrapTest.

SetAttributes[{wrapTest},HoldAll]
wrapTest[code_]:= withCodeAfter[before[];code,after[]]

Это то же самое, что звонить wrapTest[Test[f[2], 8, TestID -> "MyTest1"]]

wrapTest@
Test[f[2], 8, TestID -> "MyTest1"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...