2009-05-18 32 views
23

Tôi có một số xét nghiệm đơn vị C# thực hiện một số hoạt động nổi/đôi và tôi muốn đơn vị kiểm tra chúng. Assert.AreEqual không đủ do lỗi làm tròn.Kiểm tra đơn vị hoạt động nổi trong Visual Studio 2008 Pro

Chuyển đổi đơn vị làm ví dụ. 10,5 mét đến feet có hệ số chuyển đổi là 3.281 vì vậy tôi nhận được 34.4505. Sử dụng một yếu tố chuyển đổi chính xác hơn mang lại cho tôi 34.4488189. Tôi muốn kiểm tra điều này bên trong, ví dụ, 0,1 (vì vậy 34.3488-34.5488 sẽ vượt qua bài kiểm tra).

tôi có thể chắc chắn bằng tay kiểm tra giá trị với một sự khoan dung trong bài kiểm tra đơn vị của tôi nhưng đó là tính lặp lại và thông báo lỗi sẽ không thể rất mô tả (một lần nữa mà không cần phải viết riêng thông báo lỗi Khẳng định của tôi):

Assert.IsTrue(Math.Abs(34.4488189 - value) < 0.1); 

Tôi làm cách nào để kiểm tra hoạt động nổi của mình trong phạm vi dung sai lỗi nhất định? Tôi không thể tìm thấy bất kỳ lớp Assert nào thực hiện việc này đi kèm với VS. Tôi có bỏ lỡ nó hay tôi phải tự mình cuộn?

Có thực hành tiêu chuẩn nào trong thử nghiệm phao/đôi để ghi nhớ không?

Trả lời

38

Assert.AreEqual trong MSTest có quá tải mà chấp nhận một vùng châu thổ (lỗi khoan dung) tham số:

public static void AreEqual (double expected, double actual, double delta) 

ví dụ:

Assert.AreEqual(34.4488189, value, 0.1); 

hoặc, đối với dung sai nhỏ nhất có thể:

Assert.AreEqual(34.4488189, value, double.Epsilon); 
+8

Hah! 18 quá tải cho AreEqual. Không có gì lạ khi tôi không bắt được nó. Cảnh báo –

+0

, sử dụng 'double.Epsilon' sẽ không làm những gì bạn muốn. Epsilon là giá trị chính xác gấp đôi nhỏ nhất. Điều này chỉ áp dụng nếu bạn so sánh các giá trị theo thứ tự 10^-324, điều này rất khó xảy ra.Những gì bạn muốn làm là so sánh các giá trị gấp đôi lên đến chữ số cuối cùng mà chúng có thể đại diện. Do đó, sự khoan dung có thể là một nghìn nếu bạn so sánh các giá trị nằm trong tứ giác. Từ buzz là "ULP" (đơn vị ở vị trí cuối cùng). xem http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm –

3

Bạn có thể có một cái nhìn vào khuôn khổ NUnit:

//Compare Float values 
Assert.AreEqual(float expected, float actual, float tolerance); 
Assert.AreEqual(float expected, float actual, float tolerance, string message); 

//Compare Double values 
Assert.AreEqual(double expected, double actual, double tolerance); 
Assert.AreEqual(double expected, double actual, double tolerance, string message) 

(Trên lấy từ this bài viết)

More niêm yết here.

0

tôi trên điện thoại của tôi để tha thứ cho sự thiếu mã/liên kết.

Có câu hỏi ở đây về các tiện ích mở rộng C# yêu thích nơi mọi người đã mở rộng loại được tạo sẵn như chuỗi. Bạn có thể mở rộng loại phao bằng phương thức hoạt động như sau:

Myfloat.IsInTolerance(34.8f, 0.1f) 

..điều này sẽ trả về true nếu phao Myfloat là 0,1 bên cạnh 34,8. Nó có thể làm cho nó ít mất thời gian hơn.

0

Nhìn vào Ràng buộc bình đẳng NUnit, chúng linh hoạt! Hy vọng nó có thể giúp!

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