2012-01-03 35 views
5

Tôi đang viết một số trường hợp thử nghiệm trong một tệp .mt duy nhất chia sẻ các thủ tục thiết lập chung (và teardown). Tôi đã hy vọng sẽ thấy một cái gì đó giống như của JUnit @Before/@After, nhưng không có gì từ gói MUnit nhảy ra ngoài với tôi rằng điều đó sẽ thực hiện được điều này. Nói một cách trung thực, tài liệu về gói MUnit tốt hơn một chút so với tài liệu MUnit của Wolfram Workbench, nhưng nó cũng quá xa. Instructions on viewing the MUnit package.Tìm kiếm một cái gì đó giống như của JUnit @Before/@After trong MUnit

Vì vậy, trước khi tôi phát minh lại bánh xe, tôi nghĩ tôi sẽ kiểm tra xem tôi có bỏ sót thứ gì đó trong MUnit hoặc nếu có ai có mẫu hoạt động tốt?

Vì vậy, dựa trên Leonid Shifrin ban đầu câu trả lời (anh được cập nhật câu trả lời của mình trong khi tôi đặt này với nhau) đây là (là) tôi đang ở đâu (là) tại ...

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

Trả lời

3

MUnit file là file gói bình thường, và họ được đọc và thực hiện tuần tự - hoặc ít nhất này đã được kinh nghiệm của tôi với họ. Bạn có thể chỉ cần thêm các dòng với mã chung của bạn trước và sau các thử nghiệm của bạn, và chúng sẽ được thực hiện trước và sau tất cả các phép thử tương ứng.

Nếu bạn muốn gọi quy trình thiết lập và tách riêng cho từng thử nghiệm, bạn có thể thêm các dòng (cuộc gọi) tương ứng ngay trước và ngay sau mỗi lần kiểm tra. Bạn có thể thấy nó thuận tiện để viết một bộ tiền xử lý, mà sẽ tải các bài kiểm tra của bạn như một gói (ví dụ, bằng cách sử dụng Import["Tests.tm","HeldExpressions"] - nơi các bài kiểm tra của bạn là Tests.tm trong ví dụ này) và chèn các dòng tương ứng rồi lưu lại tệp. Điều này sẽ yêu cầu một số lưu loát với các thao tác với mã được giữ, nhưng có thể được chọn một cách hợp lý một cách nhanh chóng và rất thuận tiện nếu bạn có nhiều thử nghiệm.

EDIT

Là một thay thế trọng lượng nhẹ hơn, bạn có thể định nghĩa ngắn cắt vĩ mô như thế nào. Dưới đây là một ví dụ nội dung tập tin thử nghiệm:

(* 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]; 

[email protected] 
Test[f[2], 
    8, 
    TestID -> "MyTest1" 
] 

[email protected] 
Test[f[2], 
    8, 
    TestID -> "MyTest2" 
] 

Các chức năng beforeafter bắt chước chức năng thiết lập/teardown của bạn. Hàm withCodeAfter là macro trợ giúp thực thi mã before trước tiên, sau đó thực thi mã after, nhưng kết quả trả về kết quả là before. Các hàm wrapTestwrapTest1 minh họa hai khả năng: bạn có thể xác định các hàm "trước" và "sau" riêng lẻ và kẹp mã của bạn với chúng hoặc bạn có thể sử dụng Block và xác định macro "xung quanh", đôi khi có thể thuận tiện hơn. Các xét nghiệm sẽ hoạt động theo một trong hai cách. Bạn cũng có thể kết hợp các phương pháp này. Trong cả hai trường hợp, số lượng mã boilerplate là tối thiểu - chỉ cần thêm [email protected] dòng trước mỗi bài kiểm tra.

+0

Được rồi tôi cập nhật câu hỏi của tôi với một ví dụ khập khiễng về những gì tôi nghĩ bạn đang nói về. Bây giờ, tôi thấy những gì bạn đang nói về. Cảm ơn – mmorris

+0

@mmorris Cảm ơn bạn đã chấp nhận. Cập nhật của bạn thực sự là những gì tôi có nghĩa là trong câu trả lời ban đầu của tôi. Bản cập nhật của tôi chỉ để cho thấy làm thế nào bạn có thể giảm số lượng mã boilerplate với nỗ lực tương đối tối thiểu. –

+0

Vui lòng xem câu trả lời bên dưới. Cảm ơn Mike – mmorris

0

tôi không thể nhận được định dạng chính xác trong bình luận vì vậy tôi đang làm điều này như một câu trả lời ...

Được rồi tôi nghĩ rằng tôi đã mổ xẻ các mã trong câu trả lời của bạn, xin vui lòng cho tôi biết nếu tôi chính xác.


Xác định nội dung được đánh giá trước và sau "trường hợp thử nghiệm" được đánh giá.Một lưu ý phụ, bạn đang xác định f trong before, không xác định f trong after.

(* Mathematica Test File *) 

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

Xác định chức năng withCodeAfter. Phải có hai biểu thức, biểu thức đầu tiên, before, được đánh giá khi được truyền vào. Biểu thức thứ hai, after, được chuyển thành giá trị chưa đánh giá và là biểu thức đầu tiên được đánh giá trong phạm vi withCodeAfter. Biểu thức đầu tiên được đánh giá, before, được trả về bởi withCodeAfter.

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

Xác định chức năng wrapTest. Phải có một biểu thức, code, được chuyển thành giá trị chưa được đánh giá. Biểu thức đó, code, là biểu thức thứ hai của biểu thức phức, before[];code, được chuyển thành cụm từ đầu tiên, before, thành withCodeAfter. Biểu thức phức, before[];code, được đánh giá khi được chuyển vào withCodeAfter. Giá trị của biểu thức được đánh giá, code, được trả lại bằng withCodeAfter sau after đang được đánh giá. Giá trị được trả về bởi withCodeAfter được trả về bởi wrapTest.

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

là điều tương tự như gọi wrapTest[Test[f[2], 8, TestID -> "MyTest1"]]

[email protected] 
Test[f[2], 8, TestID -> "MyTest1"] 
+0

Vâng, bạn hoàn toàn chính xác - đây chính là điều đang xảy ra. Hàm 'withCodeAfter' chỉ là một hàm tiện lợi, nó không cần thiết - chỉ cần lưu một phần giới thiệu của biến phụ trợ để giữ kết quả của' trước'. Nó thực sự là một vĩ mô, và có lẽ những người nhỏ của các macro hữu ích mà tôi biết. Xin lỗi nếu câu trả lời của tôi không rõ ràng. –

+0

Cảm ơn bạn đã kiểm tra sự tỉnh táo! – mmorris

Các vấn đề liên quan