2010-09-23 26 views
10

tôi đang học kiểm tra VS Unit và cố này:Visual Studio Unit Test: tại sao chạy thử nghiệm không kết thúc trong khi thử nghiệm các giá trị float giống nhau?

[TestMethod()] 
    public void calcTest() 
    { 
     double expected = 1.234F; // TODO: Initialize to an appropriate value 
     double actual; 
     actual = 1.234F; 
     Assert.AreEqual(expected, actual); 
     Assert.Inconclusive("Verify the correctness of this test method."); 
    } 

Khi chạy phương pháp thử nghiệm này, nó nói không phân thắng bại ??? Tại sao ?

Cập nhật: Hi Guys ok để nói không so sánh nổi nhưng yêu cầu kinh doanh là những gì họ đang có nên tôi nên làm gì nếu tôi cần phải so sánh chúng?

Bạn có nghĩa là không thể kiểm tra tính toán nổi mà không bị đau đầu? Sau đó, nếu thử nghiệm là một nhức đầu như vậy trong tính toán tài chính không phải là nó tốt hơn để không làm thử nghiệm ở tất cả?

Có vẻ như một lỗi rất lớn hoặc lỗ hổng thiết kế trong khuôn khổ kiểm tra vs thay :) như người ta nói ở đây http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assert.inconclusive%28VS.80%29.aspx

Chỉ ra rằng một sự khẳng định không thể được chứng minh đúng hay sai.

Vì tôi so sánh 2 cùng một lứa, chắc chắn đó là sự thật!

+1

Microsoft đơn vị bộ kiểm tra bây giờ cũng bao gồm các phương pháp quá tải để thử nghiệm nổi (và đôi) bằng cách đi qua trong một dung sai delta cho biết "bằng nhau" các giá trị phải vượt qua như thế nào (http://msdn.microsoft.com/en-us/library/ms243456.aspx). Được sử dụng như thế này: 'Assert.AreEqual (float dự kiến, float thực, float delta, string failingTestMessage)' – Spiralis

Trả lời

17

erm, bởi vì bạn đã bảo nó?

Assert.Inconclusive("Verify the correctness of this test method."); 

Bây giờ bạn có bạn AreEqual, bạn sẽ có thể để loại bỏ Inconclusive

Bất kỳ thất bại này trong một cuộc kiểm tra (không bao gồm trường hợp ngoại lệ mà bạn cố tình xử lý) nói chung là thiết bị đầu cuối, nhưng bất kỳ khẳng định rằng vượt qua (như số AreEqual tại đây) chỉ tiếp tục chạy. Vì vậy, các thử nghiệm đầu tiên vượt qua, sau đó dòng cuối cùng cờ nó là không thuyết phục.

+0

Tại sao Assert.Conclusive không tồn tại? Chúng tôi không thực hiện kiểm tra thống kê ở những nơi mà Inconclusiveness như vậy là hợp lý, đây là thử nghiệm xác định nơi kết quả thử nghiệm sẽ là có hoặc không. – user310291

+0

Tôi nghĩ bạn đúng nhưng mẫu không được đặt như mặc định trong đoạn mã vì điều này rất khó hiểu. – user310291

+1

@ user310291 từ góc độ thử nghiệm, điều này không gây nhầm lẫn. Tất cả các thử nghiệm đều thất bại cho đến khi bạn viết kiểm tra chính xác (và loại bỏ phần không xác định) hoặc bạn sửa mã được kiểm tra. –

2

Điều đó không chỉ có nghĩa là số AreEqual được thông qua, có nghĩa là nó được gọi là Assert.Inconclusive, dẫn đến kết quả không xác định?

Từ the docs:

Tương tự như thất bại ở chỗ nó chỉ ra một khẳng định là không phân thắng bại mà không kiểm tra bất kỳ điều kiện.

Nếu bạn không muốn kết quả được bao gồm, loại bỏ các cuộc gọi đến Assert.Inconclusive :)

+0

Quan điểm của tôi là toán học và từ quan điểm kinh doanh chắc chắn không phải là không thuyết phục nhưng kết luận vì nó là đúng :) – user310291

+0

Phương thức xác nhận. Phương pháp xác định Cho thấy xác nhận không thể được chứng minh là đúng hay sai. – user310291

+0

theo http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assert.inconclusive%28VS.80%29.aspx – user310291

8

Ngay cả khi bạn đã gỡ bỏ các Assert.Inconclusive bạn vẫn có thể có vấn đề.

Bạn đang kiểm tra tính bình đẳng của hai số dấu phẩy động và nói chung với các giá trị được tính bạn sẽ không bao giờ nhận được chúng chính xác giống nhau. Bạn cần phải kiểm tra xem giá trị thực tế có nằm trong phạm vi có thể chấp nhận được của giá trị được mong đợi hay không:

Math.Abs(actual - expected) < 0.00001; 

chẳng hạn.

Assert.AreEqual(expected, actual); hoạt động trong trường hợp này bởi vì bạn đang gán cùng một giá trị cho cả hai biến.

+1

Cảnh báo tốt, nhưng trong trường hợp này, anh ấy so sánh hai biến được khởi tạo từ các chữ, vì vậy tôi sẽ * mong đợi * nó sẽ ổn. Nhưng 1, chắc chắn là một điểm rất tốt để nâng cao! –

+0

@Marc - Tôi phát hiện ra rằng để thêm ghi chú vào hiệu ứng đó. – ChrisF

+0

Thực tế là các biểu diễn điểm nổi chính xác có thể không tồn tại đối với một số thập phân nhất định không làm cho chúng mờ '. Điểm chung về việc không so sánh 2 float cho bình đẳng là tốt, nhưng nó không áp dụng trong trường hợp này: không có lý do gì mà trình biên dịch sẽ chọn các biểu diễn 'double' khác nhau cho * cùng' float'. – Ani

2

UnitTest tự động được tạo bởi VS và yêu cầu bạn tạo một số thao tác để so sánh. nếu bạn sẽ nhận xét lệnh Assert cuối cùng, bạn sẽ nhận được "Passed" với dấu màu xanh lá cây, nhưng bạn đã không kiểm tra nó.
Bạn cần, như trong nhận xét, "Khởi tạo một giá trị thích hợp" và như trong Assert cuối cùng "Xác minh tính chính xác của phương pháp thử nghiệm này".
Khởi tạo giá trị mong đợi và giá trị thực tế từ nơi chúng đến từ ví dụ , Dự kiến ​​là giá trị kỳ vọng từ hàm Add (x, y) trong đó x = 2 và y = 3. Giá trị thực tế phải đến từ hàm. trong trường hợp này:

// Sample - Start 
Expected = 2+3; 
Actual = Add(2,3); 
Assert.AreEqual(expected, actual); 
// Sample - End 

Hy vọng nó giúp, tôi đã phá vỡ vài răng cho điều đó ... ;-)

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